我们都同意第一个例子不能用,因为局部变量或参数必须是最终的或有效的最终才能在lambda表达式主体中使用。
但是您的第二个示例不涉及局部变量或参数,而是
str实例字段。Lambda表达式可以使用与实例方法相同的方式访问实例字段:
15.27.2。
λ体
Lambda主体可以是单个表达式或块(第14.2节)。类似于方法主体,lambda主体描述了每次调用都会执行的代码。
实际上,java编译器
lambda$0从您的lambda表达式中创建了一个私有方法,该方法仅访问实例字段
str:
private java.lang.String lambda$0() { 0 aload_0; 1 getfield 14; 4 areturn;}另一观点: 您还可以
Supplier使用普通的匿名内部类来实现:
public Supplier<String> makeSupplier() { return new Supplier<String>() { public String get() { return str; } };}从内部类访问实例字段非常普遍,而不是Java 8的专业。



