zoukankan      html  css  js  c++  java
  • java8中的map和reduce

    java8中的map和reduce

    标签: java8函数式mapreduce
     分类:
     

    java8中最受人期待的就是lambda,引入了map和reduce。map和reduce可以构成几乎所有的函数式操作。

    map

            final List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
            final List<Integer> doubleNumbers = numbers.stream()
                    .map(number -> number * 2)
                    .collect(Collectors.toList());

    结果:[2, 4, 6, 8]

    也可以搞成其他的类型,初始List是Integer,也可以变成String

            final List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
            final List<String> numberIndex = numbers.stream()
                    .map(number -> "#" + number)
                    .collect(Collectors.toList());

    结果:[#1, #2, #3, #4]

    reduce

    1.不提供初始值的reduce,返回值是Optional,表示可能为空,使用orElseGet可以返回一个null时的默认值

            final List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
            final Optional<Integer> sum = numbers.stream()
                    .reduce((a, b) -> a + b);
    sum.orElseGet(() -> 0);

    结果:10

    这里的(a, b) -> a + b的类型其实是BinaryOperator,它接受两个类型相同的参数

    当把numbers改为Arrays.asList()时,结果为0。

    2.使用初始值的reduce,因为提供了初始值,所以返回值不再是Optional

            final List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
            final Integer sum = numbers.stream()
                    .reduce(0, (a, b) -> a + b);

    结果:10

    3.另一种reduce

    上面两种类型的reduce都是争对同类型的操作的,对于类型是T的stream

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

    我真的觉得它长的好丑啊,其实可以换成map + reduce就行了

  • 相关阅读:
    音频算法之我思
    图像去模糊算法 循序渐进 附完整代码
    音频算法之小黄人变声 附完整C代码
    RocketMQ(2)---核心概念、特性、使用等
    RocketMQ(1)---架构原理及环境搭建
    RabbitMQ(2)---高级使用
    面试问题---JAVA程序CPU占用过高怎么定位
    RabbitMQ(1)---基本概念及简单demo
    JUC(4)---java线程池原理及源码分析
    JUC(3)---CountDownLatch、CyclicBarrier和AQS
  • 原文地址:https://www.cnblogs.com/lupeng2010/p/6148825.html
Copyright © 2011-2022 走看看