Java函数式编程:三、流与函数式编程( 五 )

Optional对象中 , 那么我们可以通过类似x -> Optional.of(result)这样的方法将其封装 , 但是 , 如果这么做了就一定要清楚我们该如何获取这样的流中的对象 。请牢记 , 要先验证是否存在 , 才能获取
Stream.filter(Optional::isPresent).map(Optional::get)// 到这里 , 流中的数据就都是Optional对象中包含的值了// 继续处理4、终结操作这些操作接受一个流作为参数 , 并生成一个最终结果而非返回那个流 , 因此 , 只要调用这些方法 , 流处理就将终结

  • 将流转化为一个数组
    • toArray()
    • toArray(generator)该方法会将元素保存在generator中 , 而不是创建一个新的并返回
  • 在每个流元素上应用某个终结操作
    • forEach(Consumer)在每个元素上调用Consumer方法
    • forEachOrdered(Consumer)该版本确保对元素的操作顺序是原始的流顺序
  • 收集操作
    • collect(Collector)相当复杂的一个方法 , 可以将所有元素存入我们给出的Collector容器中 。
      • 本方法主要复杂在 , 我们实际上可以使用java.util.stream.Collectors文档中相当多的对象 , 而且其中有一部分很复杂比如如果我们希望放入一个TreeSet中使它们总是有序 , 那么我们可以使用Collectors.toCollection(TreeSet::new)来创建该容器并应用
    • collect(Supplier, BiConsumer, BiConsumer)
      • 在极小情况下 , 我们无法从Collectors类中找到我们想要的处理容器 , 那么就需要第二个方法
  • 组合所有的流元素
    • reduce(BinaryOperator)组合所有元素 , 组合的方法就是参数方法
    • reduce(identity, BinaryOperator)以identity为初始值组合所有元素 , 方法为第二个参数
    • reduce(identity, BiFunction, BinaryOperator)复杂 , 未作介绍
  • 匹配 , 都是根据Predicate返回一个布尔值
    • allMatch(Predicate)
    • anyMatch(Predicate)
    • noneMatch(Predicate)
  • 选择一个元素
    • findFirst()返回一个包含流中第一个元素的Optional对象 , 若流中没有元素即返回Optional.empty
    • findAny()返回一个包含流中任意一个元素的Optional对象 , 若流中没有元素则为Optional.empty
      • 不过需要注意的是 , 该方法对于非并行的流似乎总是会选择流中的第一个元素 , 如果是并行的则随机
  • 获取流相关的信息
    • count()计算流中元素数量
    • max(Comparator)通过Comaprator获取流中最大的元素
    • min(Comparator)通过Comparator获取流中最小的元素
    • 如果是数值化的流 , 除了上面这些 , 还有以下方法
    • average()获得平均值
    • sum()获得累加值
    • summaryStatics()返回可能有用的摘要数据 , 基本没什么用

经验总结扩展阅读