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