表达式语言lambda类型推断

Ani*_*wat 11 lambda el java-ee

通常我会这样做:

Function<Integer, Integer> a = b -> b * 2;
System.out.println(a.apply(3)); // prints 6
Run Code Online (Sandbox Code Playgroud)

我很惊讶地看到EL表达式有效:

${a = b -> b * 2; a(3)}
Run Code Online (Sandbox Code Playgroud)

以上EL表达式的结果是6.a在代码片段2中声明时,编译器如何确定类型但需要在代码段1中输入类型信息?

即使这样编译并执行正常:

${(b -> b * 2)(3)}
Run Code Online (Sandbox Code Playgroud)

die*_*ter 4

EL 求值器/执行器不知道 EL 表达式中 a 的确切类型。它只知道它应该是一个Numberbecause of * 操作

${a = b -> b * 2; a(3)}
Run Code Online (Sandbox Code Playgroud)

看看这些结果:

${a = b -> b * 2; a(3)}
6

${a = b -> b * 2; a('32')}
64

${a = b -> b * 2; a('32s')}
java.lang.NumberFormatException: For input string: "32s"
Run Code Online (Sandbox Code Playgroud)

所以只有在运行时你才会得到一个异常,因为Long.parse("32s")失败了。

看看ELArithmetic.java#211的源代码

  • 请注意,EL 不是“编译”的,而是“评估的”。换句话说,EL根本不使用Java编译器。 (2认同)