Java8-Stream笔记

分批处理数据

在程序经常会处理集合数据,有时直接处理整个集合并不是很好的主意,通常需要分批次处理。比如在批量查询/插入数据到数据库的时候。

import com.google.common.collect.Iterables;
import org.apache.commons.collections4.CollectionUtils;

import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public static <T> Stream<List<T>> partitionStream(Collection<T> coll, int size) {
  if (CollectionUtils.isEmpty(coll)) {
    return Stream.empty();
  }
  return StreamSupport.stream(Iterables.partition(coll, size).spliterator(), false);
}

分组统计

有时候我们拿到一个集合,里面有重复的元素,想统计每个元素的个数,如何做?

简单集合

List<String> items = Arrays.asList("a", "b", "b", "b", "c", "c", "c");
Map<String, Long> result2 = items.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(result2);//{a=1, b=3, c=3}

实体集合

通过用TreeMap接收结果实现排序功能

List<VisitorLogs> visitorLogs = Lists.newArrayList(
                new VisitorLogs("2020-06-27", 8),
                new VisitorLogs("2020-06-27", 9),
                new VisitorLogs("2020-06-30", 7),
                new VisitorLogs("2020-06-30", 9),
                new VisitorLogs("2020-06-30", 1),
                new VisitorLogs("2020-07-05", 1),
                new VisitorLogs("2020-07-05", 8),
                new VisitorLogs("2020-07-05", 6));

TreeMap<String, Integer> collect = visitorLogs.stream().collect(Collectors.groupingBy(d -> d.getTime(), TreeMap::new, Collectors.summingInt(o -> o.getCount())));
System.out.println(collect);//{2020-06-27=13, 2020-06-30=17, 2020-07-05=15}

@Data
@NoArgsConstructor
@AllArgsConstructor
public class VisitorLogs implements Comparable<VisitorLogs> {
    private String time;
    private int count;

    @Override
    public int compareTo(VisitorLogs o) {
        return time.compareTo(o.time);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章