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

时间:2015-11-15 10:05:06

标签: java lambda java-8

我理解使用lambda表达式(LE),我们可以保存几行编码,如功能界面的对象创建。 LE也会更具可读性。但我确信这不是提供此功能的主要原因。我在谷歌搜索Why Lambda expression in java并在此article

找到了这个有趣的引用
  

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

对我而言,这看起来像流式api而不是LE的优势。即使没有提供LE,开发人员也可以实现同样的目标 创建匿名Consumer类。这里唯一有利于LE的优点是开发人员不必记住其中的对象 需要创建功能界面。所以它需要java进行函数式编程,其中开发人员说应用这个函数而他并不关心 关于对象(让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
   }


}

1 个答案:

答案 0 :(得分:0)

Lambda Expression是java 8中的一个很好的附加功能。它允许更快的开发并且基于函数式编程。 在代码中使用lambda表达式有不同的方法取决于编译器能够识别数据类型,返回类型,唯一重载函数(智能编译也称为类型推断 )。对于Lexical范围界定,可以引用Link。 以下是使用lambda表达式的方法:

一个。如果要定义在功能接口内声明的方法, 比如,函数接口作为参数/参数提供给从main

调用的方法
    @FunctionalInterface
    interface FInterface{
     int callMeLambda(String temp);
    }

   class ConcreteClass{

     void funcUsesAnonymousOrLambda(FInterface fi){
      System.out.println("===Executing method arg instantiated with Lambda==="));
     }

     public static void main(){
      // calls a method having FInterface as an argument.
      funcUsesAnonymousOrLambda(new FInterface() {

      int callMeLambda(String temp){ //define callMeLambda(){} here..
      return 0;
    }
    });

    /***********Can be replaced by Lambda below*********/
    funcUsesAnonymousOrLambda( (x) -> {
     return 0; //(1)
    }

    }
  

FInterface fi =(x) - &gt; {return 0; };

     

funcUsesAnonymousOrLambda(FI);

上面解释了lambda表达式的一个特定用法,让我们看看我们可以看到各种其他用法的loc -

 funcUsesAnonymousOrLambda( (String x) {
     return 0;
     });

可以通过多种方式使用lambda expr实现 一个。没有花括号,如果只有一个衬垫 -

  funcUsesAnonymousOrLambda((String x) -> return 0);

湾上面没有return语句(编译器非常聪明,可以自动识别返回) funcUsesAnonymousOrLambda((String x) - &gt; 0);

℃。不指定arg的字符串类型

funcUsesAnonymousOrLambda((x) -> 0);

d。
用大括号和新的本地字段初始化

funcUsesAnonymousOrLambda( (String x) ->
{ //curly braces as we need more statements

String newVarString = " world";
Sysout("___" + x +  newVarString);

});

注意:上面的本地字段可以存在,但如果在内部访问外部作用域(外部方法的局部变量)中的某些字段,则允许获取该字段但不修改该字段。 REF Java 8 lambda within a lambda can't modify variable from outer lambda

  

Collections.sort(list,(o1,o2) - &gt; {return o1.compareTo(o2);}

在实现比较方法时,Lambda Expr在实现Comparator接口时非常有用(与上面的示例非常相似)。当需要快速开发时,Python有时优于java,但lambda为java提供了新的曲线。