Stream流自用api收集

去重

方式一:

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值