基本语法
/**
1) 声明: 即和λ表达式绑定的接口类型,例如Function<T, R>
2) 参数: 包含在一对小括号中,参数类型和参数个数必须和函数式接口中的抽象方法的参数类型和参数个数且参数顺序一致。
3) 操作符: ->
4) 执行代码块: 包含在一对大括号中,出现在操作符的右侧。
*/
Interface<T> in = (Type1 param1, Type2 param2, ..., TypeN paramN)
-> {
statment1;
statment2; //.............
return statmentM;
}
1. 如果执行代码块里仅有一条语句,可省略大括号
Stream<String> stream2 = Stream.of("l","s","j"); stream2.forEach((String a) -> { System.out.println(a); }); stream2.forEach((String a) -> System.out.println(a)); // 可以省略大括号
2. 省略参数类型
JVM可以根据上下文推断出参数类型。为什么可以推断出呢? 因为函数式接口的定义:该接口仅有一个非default、非static、非Object继承来的抽象方法,该抽象方法的参数类型决定了小括号里面的参数类型和顺序,当然JVM就可以推断出参数的类型。
(param1,param2, ..., paramN) -> { statment1; statment2; //............. return statmentM; }
stream2.forEach((a)-> System.out.println(a)); // 省略了参数类型,省略了大括号
3. lamada表达式参数仅一个,可省略小括号
param1 -> { statment1; statment2; //............. return statmentM; }
例如:
set.stream().map(x -> x.get());
4. 如果函数式接口有返回值,切当执行代码块只有一句语句时,可省略return
/**声明一个接口 */ interface LambdaTest<T, R> { R test(T t, T t2); }
LambdaTest<Integer, Integer> lambdaTest1 = (x, y) -> { return x + y; }; LambdaTest<Integer, Integer> lambdaTest2 = (x, y) -> x + y; // 这里省略return关键字 System.out.println(lambdaTest1.test(1,2)); // 3 System.out.println(lambdaTest2.test(1, 2)); // 3
可以看出,当执行代码块里面仅有一句时,可省略return关键字。
总的来说:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值