美文网首页Java
Stream API使用

Stream API使用

作者: 王侦 | 来源:发表于2019-07-25 11:16 被阅读29次

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

    1.为什么引入Stream?

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

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

    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);
    

    参考

    相关文章

      网友评论

        本文标题:Stream API使用

        本文链接:https://www.haomeiwen.com/subject/ztwxrctx.html