源代码如下(使用jdk8):
@FunctionalInterface
public interface Base<T> {
/**
* 获取对象
* @return 对象
*/
T get();
}
@FunctionalInterface
public interface BaseFactory<T> {
/**
* 创建新的值
* @return 新的值
*/
Base<T> create();
}
public interface Key<K> extends Base<K> {}
@FunctionalInterface
public interface KeyFactory<K> extends BaseFactory<K> {
/**
* 创建新的键值
* @return 新的键值
*/
Key<K> create();
}
以下这个类是一个具体的整型键(Key<Integer>)的创建工厂类:
public class IntegerKeyFactory implements KeyFactory<Integer> {
private int start = 0;
public IntegerKeyFactory() {}
public IntegerKeyFactory(int start) {this.start = start;}
@Override
public Key<Integer> create() {
return () -> start++;
}
public static void main(String[] args) {
IntegerKeyFactory factory = new IntegerKeyFactory(1);
for (int index = 0; index < 10; index++) {
System.out.println(factory.create().get());
}
}
}
执行结果如下:
1 2 3 4 5 6 7 8 9 10
由于想偷懒不写Key<K>接口的实现类,所以在IntegerKeyFactory中用了lambda表达式(return () -> start++;),但等到写完后并且添加了main方法测试后才反应过来:lambda表达式不能访问外部可以被修改的变量(如果变量是引用,引用的地址不能修改),可是因为写好后编译器没有报错,就尝试执行了下,发现可以正确运行,并且这个结果也是我期望的。
有哪位大神能告诉我这是不是个Bug?如果不是Bug,这个原理(lambda表达式修改了外部变量(int类型)的值)是什么?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
start不是类内的私有属性?怎么成了外部变量?知道了,又学到了一点,类内部变量可以在lambda表达式中使用,区别于外部变量是类内部私有属性啊,但相对于lambda表达式不是外部变量吗?