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

M S*_*ach 3 java lambda java-8

我理解使用lambda表达式(LE),我们可以为函数接口保存几行编码,如对象创建.LE也会更具可读性.但我确信这不是提供此功能的主要原因.我在谷歌搜索它Why Lambda expression in java,我在这篇文章中找到了这个有趣的引用

在Java 8之前,处理任何集合的元素可以通过从集合中获取迭代器然后迭代元素然后处理每个元素来完成.如果要求是并行处理元素,则由客户端代码完成.随着Java 8中Stream API的引入,函数可以传递给集合方法,现在集合的责任是以顺序或并行的方式处理元素. -

对我而言,这似乎是流式api而不是LE的优势.即使没有提供LE,开发人员也可以通过创建匿名Consumer类来实现相同的目标.这里唯一有利于LE的优点是开发人员不必记住需要创建哪个功能接口的对象.所以它需要java进行函数式编程,其中dev表示应用这个函数并且他不关心对象(让jvm处理这个).

这是LE的主要优势还是还有另一个主要优势呢?

更新: -

我尝试了下面简单的程序,我尝试用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
   }


}
Run Code Online (Sandbox Code Playgroud)

Luk*_*aia 5

我不认为lambda表达式有一个主要目的,而是许多小的额外好处,它们共同产生巨大影响.

  • Lambdas删除了很多样板代码.

  • 它们使代码更短,更易于阅读.

  • 减少了对匿名内部类的需求.

  • 允许更多代码重用.

还有更多功能.

lambdas最喜欢的一个优点是能够制作默认的接口方法.我不认为我现在没有的东西.

所以lambdas没有一个特定的理由存在.它们为更多功能性编程打开了大门,允许Java发展,并使整个编码更加有趣.


Tag*_*eev 3

一般来说,你是对的:Stream API 可以在没有 lambda 函数的情况下存在,使用匿名类。虽然它看起来真的很难看,而且工作效率稍低。至于时间测量,你的结果完全无关。有关详细信息,请参阅此问题。

  • @MSach,您的基准测试中有更多问题,而不仅仅是热身。其中之一是“System.out.println”调用是同步的。当并行流中进行的唯一操作是全局同步的时,并行化它是没有意义的。您只是将时间浪费在创建线程、拆分输入并将它们同步回单个监视器上。 (2认同)