Stream API使用

其他内容请参考Stream官方文档。

1.为什么引入Stream?

Stream是Java函数式编程的主角。函数式编程两个优点:

  • 代码简洁,函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。
  • 多核友好,Java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下parallel()方法。

2.流


3.重点分析归约操作reduce和collect

3.1 reduce

reduce操作可以实现从一组元素中生成一个值。

Optional reduce(BinaryOperator accumulator)

T reduce(T identity, BinaryOperator accumulator)

 U reduce(U identity, BiFunction accumulator, BinaryOperator combiner)

3.2 collect

从Stream生成一个集合或者Map等复杂的对象。

     R collect(Supplier supplier,
                  BiConsumer accumulator,
                  BiConsumer combiner);

不过每次调用collect()都要传入这三个参数太麻烦,收集器Collector就是对这三个参数的简单封装,所以collect()的另一定义为

     R collect(Collector collector);

可查看Collectors.toList()是怎么封装的:

    public static 
    Collector> toList() {
        return new CollectorImpl<>((Supplier>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }
Stream stream = Stream.of("I", "love", "you", "too");
List list = stream.collect(Collectors.toList()); // (1)
// Set set = stream.collect(Collectors.toSet()); // (2)
// Map map = stream.collect(Collectors.toMap(Function.identity(), String::length)); // (3)

两种方式的对比:

Stream stream = Stream.of("I", "love", "you", "too");
List list = stream.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);// 方式1
//List list = stream.collect(Collectors.toList());// 方式2
System.out.println(list);

参考

  • Java Stream API入门篇
  • Java Stream API进阶篇

你可能感兴趣的:(Stream API使用)