我理解使用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
}
}
答案 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提供了新的曲线。