Java中的流式编程(Stream)

1 Stream介绍

StreamJava 8 的新功能,是对集合(Collection)对象功能的增强,可以非常方便地对集合中的对象进行操作。
Lambda表达式结合,可以提高编程效率、代码的简洁性与可读性。Stream流其实是一个集合元素的函数模型,
它并不是集合,也不是数据结构,其实本身并不存储任何元素Stream是一个来自数据源的元素队列。
注意: Stream就如同一个迭代器,单向不可往复。

2 Stream方法

2.1 过滤

  • peek():帮助调试,允许无修改地查看流中的元素。
  • sorted():排序,可以传入Comparator参数。
  • disrinct():消除流中的重复元素。
  • filter(Predicate):过滤操作则会留下使用过滤方法返回值为true的元素。

2.2 应用函数到元素

  • map(Function):将原来流中的每个元素都调用参数里的方法,其返回值汇总起来产生一个新的流。
  • mapToInt(ToIntFunction):结果为IntStream
  • mapToLong(ToLongFunction):结果为LongStream
  • mapToDouble(ToDoubleFunction):结果为DoubleStream

2.3 结束操作

  • toArray():将流转换成适当类型的数组。
  • toArray(generator):在特殊情况下,生成器用于分配自定义的数组存储。
  • forEach(Consumer): 如使用System.out::println 作为函数。
  • forEachOrdered(Consumer):确保按照流的顺序执行。
  • parallel():可实现多处理器并行操作。实现原理是将流分割为多个(通常数目为 CPU 核心数)并在不同处理器上分别执行操作。而进行并行操作的时候,forEach操作无法保证元素按原来的顺序输出,而forEachOrdered则可以确保按原来的顺序输出。

2.4 收集流元素到集合

  • collection(Collector):使用Collector收集流元素到集合中。
  • collect(Sipplier,BiConsumer,BiConsumer):收集流元素到结果集合中,第一个参数用于创建新的结果集合,第二个参数用于将下一个元素加入到现有结果集合中,第三个参数用于将两个结果合集合并。

2.5 匹配

  • allMatch(Predicate) :如果流的每个元素根据提供的 Predicate 都返回 true 时,最终结果返回为 true。这个操作将会在第一个 false 之后短路,也就是不会在发生 false 之后继续执行计算。
  • anyMatch(Predicate):如果流中的任意一个元素根据提供的 Predicate 返回 true 时,最终结果返回为 true。这个操作将会在第一个 true 之后短路,也就是不会在发生 true 之后继续执行计算。
  • noneMatch(Predicate):如果流的每个元素根据提供的 Predicate 都返回 false 时,最终结果返回为 true。这个操作将会在第一个 true 之后短路,也就是不会在发生 true 之后继续执行计算。

2.6 查找元素

  • findFirst():返回一个含有第一个流元素的 Optional类型的对象,如果流为空返回 Optional.empty
  • findAny():返回含有任意流元素的 Optional类型的对象,如果流为空返回 Optional.empty

2.7 统计

  • average():求取流元素平均值
  • max()min():求元素的最大值和最小值,对于非数字流则要多一个Comparator参数。
  • sum():对所有流元素进行求和。
  • count():流中的元素个数。

3 示例

public Map<Long, List<WorkSite>> testCase(List<Long> workSiteChoie) {
        WorkSite workSite11 = new WorkSite(3L, "测试地点1", 120.32, 30.24,1.1);
        WorkSite workSite12 = new WorkSite(3L, "测试地点2", 120.54, 31.44,2.0);
        WorkSite workSite13 = new WorkSite(3L, "测试地点3", 121.42, 37.22,3.0);
        WorkSite workSite21 = new WorkSite(2L, "测试地点4", 124.76, 31.10,4.0);
        WorkSite workSite22 = new WorkSite(2L, "测试地点5", 130.17, 30.55,5.0);
        WorkSite workSite23 = new WorkSite(2L, "测试地点6", 130.17, 30.55,6.0);
        WorkSite workSite31 = new WorkSite(1L, "测试地点7", 130.17, 30.55,7.0);
        WorkSite workSite32 = new WorkSite(1L, "测试地点8", 130.17, 30.55,8.0);
        WorkSite workSite33 = new WorkSite(1L, "测试地点9", 130.17, 30.55,9.0);
        List<WorkSite> workSites = Arrays.asList(workSite11, workSite12, workSite13, workSite21, workSite22,workSite23,
            workSite31,workSite32,workSite33);
    	
        List<WorkSite> workSiteList = workSites.stream()
            // 过滤掉ID为空的数据
            .filter(workSite -> workSite.getId() != null)
            // 去重
            .distinct()
            // 选择数据处理
            .peek(workSite -> {
                    if (workSiteIds != null && workSiteIds.contains(workSite.getId())){
                        workSite.setChoose(true);
                    }
                })
            // 根据距离排序
            .sorted(Comparator.comparing(WorkSite::getDistance))
            .collect(Collectors.toList());
    	
        Map<Long, List<WorkSite>> collect = workSiteList.stream()
            // 根据id分组
            .collect(Collectors.groupingBy(WorkSite::getId));
        collect.forEach((k,v)-> {
                System.out.println("key : " + k + " value : " + v);
            });
    	reture collect;
    }
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘风-随手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值