Java

Stream API使用

2019-07-25  本文已影响29人  王侦

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

1.为什么引入Stream?

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

2.流


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

3.1 reduce

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

Optional<T> reduce(BinaryOperator<T> accumulator)

T reduce(T identity, BinaryOperator<T> accumulator)

<U> U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)

3.2 collect

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

    <R> R collect(Supplier<R> supplier,
                  BiConsumer<R, ? super T> accumulator,
                  BiConsumer<R, R> combiner);

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

    <R, A> R collect(Collector<? super T, A, R> collector);

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

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

两种方式的对比:

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

参考

上一篇下一篇

猜你喜欢

热点阅读