当前位置: 首页 > 知识库问答 >
问题:

为什么在Java中使用lambda表达式?

齐博厚
2023-03-14

我知道使用lambda expression(LE)我们可以节省一些代码行,比如为函数接口创建对象。而且LE将更易读。但我确信这并不是提供该功能的主要原因。我在google上搜索why Lambda expression in java,并在本文中找到了这段有趣的引用

在Java8之前,处理任何集合的元素都可以通过从集合中获取迭代器,然后html" target="_blank">迭代元素,然后处理每个元素来完成。如果需要并行处理这些元素,那么将由客户端代码完成。随着Java 8中Stream API的引入,函数可以传递给集合方法,现在集合负责以顺序或并行的方式处理元素。-

我尝试了下面的简单程序,在这里我尝试用lambda表达式来衡量并行处理的性能。发现并行处理需要84个单位的时间,而顺序处理只需要4个单位的时间。这是因为程序不够大,而且线程开销可能在这里发挥作用吗?也许优势可以在更大的功能中显现出来?

public class Java8Tester {

   final static String salutation = "Hello! ";

   public static void main(String args[]){
      List<String> stringList = new ArrayList<String>();


      for(int i=0;i <100;i++){
      stringList.add("Hello1");
      stringList.add("Hello2");
      }

     long startTime  = System.currentTimeMillis();
       System.out.println(startTime);
      stringList.parallelStream().forEach((string) -> {System.out.println("content is " + string);
      });
      long stopTime  = System.currentTimeMillis();
      System.out.println(stopTime);
      System.out.println("time taken in parallel processing" + (stopTime - startTime)); // took 84 units of time


       startTime  = System.currentTimeMillis();
       System.out.println(startTime);

     for(String str : stringList ) {
         System.out.println("content is " + str);
     }

       stopTime  = System.currentTimeMillis();
      System.out.println(stopTime);
      System.out.println("time taken in sequential processing" + (stopTime - startTime)); // // took 4 units of time
   }


}

共有1个答案

司空宣
2023-03-14

一般来说,您是对的:流API可以在没有lambda函数的情况下存在,使用匿名类。虽然它看起来真的很难看,而且工作效率也会低一些。至于时间测量,你的结果完全不相关。详见此问题。

 类似资料:
  • 在Java中lambda表达式是怎样的对象?作为函数式编程的一部分,lambda表达式如何在Java中实现,而Java是一种面向对象的语言?我需要哪些Java概念来理解lambda表达式?

  • 问题内容: 我正在阅读有关Java 8的教程,作者在 其中显示了代码: 然后说 无法从lambda表达式内访问默认方法。以下代码无法编译: 但是他没有解释为什么这是不可能的。我运行了代码,但出现了错误, 不兼容的类型:公式不是功能界面` 那么为什么不可能或错误的含义是什么呢? 该接口满足具有一种抽象方法的功能接口的要求。 问题答案: 这或多或少是范围的问题。从JLS 与出现在匿名类声明中的代码不同

  • 问题内容: 我升级到Java 8,并尝试用新的lamdba表达式替换Map中的简单迭代。循环搜索空值,如果找到一个,则引发异常。旧的Java 7代码如下所示: 我将其转换为Java 8的尝试如下所示: 谁能解释为什么此处不允许该声明以及如何更正该声明? Eclipse的快速修复建议对我来说并不正确……它只是在语句周围加上了一个块: 问题答案: 不允许抛出检查异常,因为接口中的方法未在其子句中声明任

  • 问题内容: 这是我的代码 输出: 我无法在我的代码的以下部分中区分两者 有人能和be并解释两者的区别吗? 问题答案: 该方法旨在创建一个使用基于对象属性的订单进行比较的。当使用lambda表达式(这是此处的简短写法)作为属性提供程序函数时,结果将比较值本身。这工作时,要比较的对象有一个 自然秩序 的了。 所以 与…相同 尽管后者更有效,因为它对于具有自然顺序的所有类型都实现为单例(和实现)。 根本

  • 主要内容:作为参数使用Lambda表达式,访问变量,方法引用在《 Java Lambda表达式》和《 Java Lambda表达式的3种简写方式》一节中我们了解了 Java Lambda 的概念并可以在匿名类的场合使用 Lambda 语法进行简单替换。本节主要介绍在 Java 中如何使用 Lambda 表达式。 作为参数使用Lambda表达式 Lambda 表达式一种常见的用途就是作为参数传递给方法,这需要声明参数的类型声明为函数式接口类型。示例代码如下:

  • 问题内容: 考虑以下Java 8代码段。 什么是越来越编译? 我知道Lambda并没有实现为匿名内部类。但是,因此接口必须在生成某种对象,但是尚不清楚在生成哪种对象。 Java 8中是否存在某种表示lambda表达式的新型对象? 更新 这是经过反编译的程序,该程序已使用eclipse java 8编译器编译,当您打开类文件时,以下输出来自eclipse。 看起来lambda表达式已变成包含lamb