去重
方式一:
list.stream().collect(collectingAndThen(toCollection(() -> new TreeSet<>(Comparator.comparing(x -> x.get("key").toString()))), ArrayList::new));
若含有多个字段可以通过字符串拼接的方式例如:
Comparator.comparing(x -> x.get("key1")+"_"+x.get("key2"))
方式二:
list.stream().filter(distinctByKey(x->x.get("mainkey"))).collect(Collectors.toList());
//distinctByKey方法
public static <T> Predicate<T> distinctByKey(Function<? super T,Object> keyExtractor){
Map<Object,Boolean> map = new ConcurrentHashMap<>();
return t->map.putIfAbsent(keyExtractor.apply(t),Boolean.TRUE) == null;
}
返回结果去重后的原集合泛型的ArrayList
分组
list.stream().collect(Collectors.groupingBy(x -> x.get("key").toString()));
返回结果为Map、结果map的key为x.get(“key”),map的value为原集合的一个子集合,并且该子集合元素***x.get(“key”)***的值相同
过滤
list.stream().filter(x -> x.getInt("key") >= 60).collect(Collectors.toList());
返回结果为满足x.getInt(“key”) >= 60条件的集合
排序
list.stream().sorted(Comparator.comparing(x -> (int) x.get("key"), Comparator.nullsLast(Comparator.reverseOrder()))).collect(Collectors.toList());
返回一个集合、集合内元素根据选定的key进行排序。
计算
求和
list.stream().collect(Collectors.summingInt(x -> Integer.valueOf(null == x.get("value")?0:""+x.get("value"))));
最大值
list.stream().collect(Collectors.maxBy(x -> Integer.valueOf(null == x.get("value")?0:""+x.get("value"))));
最小值
list.stream().collect(Collectors.minBy(x -> Integer.valueOf(null == x.get("value")?0:""+x.get("value"))));
平均值
list.stream().collect(Collectors.averagingDouble(x -> Integer.valueOf(null == x.get("value")?0:""+x.get("value"))));
收集
list.stream().collect(Collectors.toMap(x -> x.get("key1"), y -> y.get("key2"),(v1,v2)->v2));
返回结果为集合元素两个字段的的值收集为一个map、当有重复时选取最新的值, key: x.get(“key1”) value: y.get(“key2”)
切割list
List<List<GenericServiceImp>> smallLists = bigList.stream()
.collect(Collectors.groupingBy(i -> bigList.indexOf(i) / 10))
.values()
.stream()
.map(v -> v.stream().collect(Collectors.toList()))
.collect(Collectors.toList());
示例如下:创建一个大的集合分成十等份,也可以用guava的工具类`Lists.partition(dataList, 10)`
// 创建一个大的List
List<GenericServiceImp> bigList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
GenericServiceImp imp = new GenericServiceImp();
bigList.add(imp);
}
// 将大的List拆分成10个List
List<List<GenericServiceImp>> smallLists = bigList.stream()
.collect(Collectors.groupingBy(i -> bigList.indexOf(i) / 10))
.values()
.stream()
.map(v -> v.stream().collect(Collectors.toList()))
.collect(Collectors.toList());
// 打印结果
smallLists.forEach(System.out::println);
System.out.println("=======================");
List<List<GenericServiceImp>> partition = Lists.partition(bigList, 10);
partition.forEach(System.out::println);