一、概念:
Lambda 表达式是使用最小可能语法编写的函数定义。
1、 Lambda 表达式产生的是函数,而不是类。 虽然在 JVM上,一切都是类,但是幕后有各种操作执行让 Lambda 看起来像函数;
2、 Lambda 语法尽可能少,这正是为了使 Lambda 易于编写和使用。
二、为什么使用Lambda 表达式
Java8之前创建函数对象的主要手段就是匿名类;
Collections.sort(words,newComparator<String>(){
publicintcompare(Strings1,Strings2){
returnInteger.compare(s1.length(),s2.length());
}
});
然而匿名类的冗长,使得Java中的函数式编程成为一种吸引人的前景。在Java8中,语言形式化了这样的概念,特别对待抽象方法的接口。这些接口现在称为函数式接口,并且Java允许你使用lambda表达式或简称lambda来创建这些接口的实例。
Collections.sort(words,
(s1,s2)->Integer.compare(s1.length(),s2.length()));在这里插入代码片
Lambda在功能上与匿名类相似,但更为简洁,通常比匿名内部类产生更易读的代码
三、Lambda语法
interface Description {
String brief();
}
interface Body {
String detailed(String head);
}
interface Multi {
String twoArg(String head, Double d);
}
public class LambdaExpressions {
static Body bod = h -> h + " No Parens!"; // [1]
static Body bod2 = (h) -> h + " More details"; // [2]
static Description desc = () -> "Short info"; // [3]
static Multi mult = (h, n) -> h + n; // [4]
static Description moreLines = () -> {
// [5]
System.out.println("moreLines()");
return "from moreLines()";
};
public static void main(String[] args) {
System.out.println(bod.detailed("Oh!"));
System.out.println(bod2.detailed("Hi!"));
System.out.println(desc.brief());
System.out.println(mult.twoArg("Pi! ", 3.14159));
System.out.println(moreLines.brief());
}
}
===========================================================
/* Output:
Oh! No Parens!
Hi! More details
Short info
Pi! 3.14159
moreLines()
from moreLines()
*/
**任何 Lambda 表达式的基本语法是:**
1、参数
2、-> 方法通用标识(个人理解)
3、-> 之后的内容方法体
[1] 当只用一个参数,可以不需要括号 ()。 然而,这是一个特例。
[2] 正常情况使用括号 () 包裹参数。 为了保持一致性,也可以使用括号 () 包裹单个参数,虽然这种情况并不常见。
[3] 如果没有参数,则必须使用括号 () 表示空参数列表。
[4] 对于多个参数,将参数列表放在括号 () 中。
[5] 如果Lambda 表达式方法体是单行。 该表达式的结果自动成为 Lambda 表达式的返回值,在此处使用 return 关键字是非法的。 这是 Lambda 表达式简化相应语法的另一种方式。
[6] 如果在 Lambda 表达式中是多行,则必须将这些行放在花括号中。 在这种情况下,就需要使用 return。
四、Lambda 表达式应用
1、计算阶乘
import org.junit.Test;
interface IntCall {
int call(int arg);
}
public class RecursiveFactorial {
static IntCall intCall;
private static void calculatingFactorial() {
intCall = n -> n == 0 ? 1 : n * intCall.call(n - 1);
}
@Test
public void test() {
calculatingFactorial();
for(int i = 0; i <= 5; i++) {
System.out.println(intCall.call(i));
}
}
}
2、Fibonacci 序列
public class RecursiveFibonacci {
IntCall fib;
RecursiveFibonacci() {
fib = n -> n == 0 ? 0 :
n == 1 ? 1 :
fib.call(n - 1) + fib.call(n - 2);
}
int fibonacci(int n) {
return fib.call(n);
}
public static void main(String[] args) {
RecursiveFibonacci rf = new RecursiveFibonacci();
for(int i = 0; i <= 10; i++) {
System.out.println(rf.fibonacci(i));
}
}
}