宁波Java培训
达内宁波中心

13429669395

热门课程

达内:Java8 Lambda表达式和流操作

  • 时间:2015-12-18
  • 发布:宁波java培训
  • 来源:OPEN资讯


    宁波达内Java培训专家指出,使用传统的 Java 编程风格——iterator 和 for-each 循环——比 Java 8 的实现性能更佳。

    Java 8 中的 Lambda 表达式和流(Stream)大受青睐,人们普遍认为这是 Java 8 最令人激动的特征。这些新的语言特征允许采用函数式风格来进行编码,我们可以用这些特性完成许多有趣的功能。

    我们从一个 ArrayList 找出最大值,将传统方式与 Java 8 中的新方式进行测试,比较两种风格的区别。

    测试得出的结论表明,Java 8 中提供的任何一种新方式都会产生约 5 倍的性能差异。有时使用简单迭代器循环比混合 lambda 表达式和流更有效,即便这样需要多写几行代码,且需要跳过甜蜜的语法糖。

    使用迭代器或 for-each 循环是遍历 ArrayList 最有效的方式,性能比采用索引值的传统 for 循环方式好两倍。

    在 Java 8 的方法中,并行流的性能最佳。

    Lambda 表达式的速度介于流与并行流之间。这一结果令人惊讶,因为lambda 表达式的实现方式是基于流的 API 来实现的。

    命令式风格:

iteratorMaxInteger()——使用迭代器遍历列表:

public int iteratorMaxInteger() {
    int max = Integer.MIN_VALUE;
    for (Iterator it = integers.iterator(); it.hasNext(); ) {
        max = Integer.max(max, it.next());
    }
    return max;
}

forEachLoopMaxInteger()——不使用迭代器,使用 For-Each 循环遍历列表

public int forEachLoopMaxInteger() {
    int max = Integer.MIN_VALUE;
    for (Integer n : integers) {
        max = Integer.max(max, n);
    }
    return max;
}

forMaxInteger()——使用简单的 for 循环和索引遍历列表:

public int forMaxInteger() {
    int max = Integer.MIN_VALUE;
    for (int i = 0; i < size; i++) {
        max = Integer.max(max, integers.get(i));
    }
    return max;
}

    函数式风格:

parallelStreamMaxInteger()——使用 Java 8 并行流遍历列表:

public int parallelStreamMaxInteger() {
    Optional max = integers.parallelStream().reduce(Integer::max);
    return max.get();
}

lambdaMaxInteger()——使用 lambda 表达式及流遍历列表。优雅的一行代码:

public int lambdaMaxInteger() {
    return integers.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));
}

forEachLambdaMaxInteger()——这个用例有点混乱。因为Java 8 只能使用 final 变量,所以我们创建一个 final 包装类,就可以访问到更新后的最大值。

public int forEachLambdaMaxInteger() {
    final Wrapper wrapper = new Wrapper();
    wrapper.inner = Integer.MIN_VALUE;

    integers.forEach(i -> helper(i, wrapper));
    return wrapper.inner.intValue();
}

public static class Wrapper {
    public Integer inner;
}

private int helper(int i, Wrapper wrapper) {
    wrapper.inner = Math.max(i, wrapper.inner);
    return wrapper.inner;
}

streamMaxInteger()——使用 Java 8 的流遍历列表:

public int streamMaxInteger() {
    Optional max = integers.stream().reduce(Integer::max);
    return max.get();
}

    总结:

    宁波达内Java培训专家得出结论,Java 8 中使用 lambda 表达式和流确实非常好,但是使用传统迭代器和 for-each 循环的 Java 编程风格比 Java 8 中的新方式性能高很多,甚至可能有5倍的性能差距,如果影响了系统的核心功能或成为系统瓶颈,那就太糟糕了。

原文链接: http://www.importnew.com/17262.html


上一篇:达内:Java内部类相关知识
下一篇:2016年最热门的10个IT岗位

达内java大数据班就业喜报,最高月薪达18000元

795万高校毕业生创历史新高,2017届毕业生就业近况几何?

达内Linux学员毕业2周就业率96%,最高薪资10000元

达内教育总裁韩少云受邀出席GIE国际教育峰会做主题演讲

选择城市和中心
贵州省

广西省

海南省