java – 在lambda中使用类字段
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在lambda中使用类字段,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1959字,纯文字阅读大概需要3分钟。
内容图文
参见英文答案 > Java lambdas have different variable requirements than anonymous inner classes 2个
> Unexpected error using lambdas in Java 8 1个
我不明白这种行为.
这段代码符合:
public class A {
private String s;
private Function<String, String> f = e -> s;
public A(String s) {
this.s = s;
}
}
但如果我做了最后的,那么我得到一个编译器错误:
public class A {
private final String s;
private Function<String, String> f = e -> s; // Variable 's' might not have been initialized
public A(String s) {
this.s = s;
}
}
这是为什么?如果是相反的方式,我明白了,但是当我声明一个字段final(这迫使我在构造函数中初始化它的值)时,编译器是怎么抱怨的,当它不是最终的时候它可以吗?
解决方法:
它与lambda无关,这个例子有同样的错误:
public class Test {
private final String a;
private String b = a; // // Variable 'a' might not have been initialized
public Test(String a) {
this.a = a;
}
}
这是因为声明位置的初始化是在构造函数之前执行的.因此,在b的声明处,a仍未初始化.
使用此示例时很明显:
public class Test {
private String a = "init";
private String b = a;
public Test(String a) {
this.a = a;
}
public static void main(String[] args) {
System.out.println(new Test("constructor").b);
}
}
当你运行它时,它打印“init”(最初分配字段a的值)而不是“构造函数”,因为b的初始化发生在运行构造函数之前.
你的例子中的lambda使它更复杂,因为我们可以预期,由于对a的访问是延迟的,编译器就可以了,但显然编译器只遵循“不访问”的一般规则.变量在它初始化之前“.
您可以使用访问器方法绕过它:
public class Test {
private final String a;
private String b = getA(); // allowed now, but not very useful
private Function<String, String> f = e -> getA(); // allowed now and evaluated at the time of execution of the function
public Test(String a) {
this.a = a;
}
public static void main(String[] args) {
System.out.println(new Test("constructor").b); // prints "null"
System.out.println(new Test("constructor").f.apply("")); // prints "constructor"
}
public String getA() {
return a;
}
}
内容总结
以上是互联网集市为您收集整理的java – 在lambda中使用类字段全部内容,希望文章能够帮你解决java – 在lambda中使用类字段所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。