关于java8 stream中需要使用final变量的思考
关于final的使用final 变量final 方法final 类
关于不能使用final的解释
关于final的使用
final 变量
final 限制的变量可以是基础数据类型和引用数据类型 基本数据类型:内容不可变 引用数据类型:引用的指向不可变,执行的对象的值可以改变。例如
public static void main(String[] args) {
final List
list.add("test");//ok
list = new LinkList<>();// can`t be compiled
}
final 方法
final 标注的方法都是不能被继承、更改的,所以对于 final 方法使用的第一个原因就是方法锁定,以防止任何子类来对它的修改
public class Student {
private Stirng name;
public final void printName() {
System.out.print(this.name);
}
}
public class StudentExtend extends Student {
@Override //can`t be compiled
public final void printName() {
System.out.print(this.name);
}
}
final 类
final 修饰的类,表明该类是最终类,它不希望也不允许其他来继承它
public class Student {
private Stirng name;
public final void printName() {
System.out.print(this.name);
}
}
public class StudentExtend extends Student { can`t be compiled
}
关于不能使用final的解释
原因一
public void test() {
List
itemList.addAll(Arrays.asList("1", "2", "3", "4", "1", "2", "3", "4", "5"));
List
itemList1.addAll(Arrays.asList("1", "2", "3", "4", "1", "2", "3", "4", "5"));
Stream
.map(i -> {
if (itemList1.contains(i)) {
System.out.println(i + 1);
}
return i;
}); // 中间求值过程 并未执行 初始化的过程中已经将itemList1的引用传递进去了
itemList.add("6");
itemList1.add("6");
// itemList1 = null;
limit.limit(20)
.collect(Collectors.toList());//终端操作 进行求值运算 如何 itemList1 = null;能执行 就会导致 终端求值过程被破坏
}
原因二
List itemList = new ArrayList<>();
itemList.addAll(Arrays.asList("1", "2", "3", "4", "1", "2", "3", "4", "5"));
List itemList1 = new ArrayList<>();
itemList1.addAll(Arrays.asList("1", "2", "3", "4", "1", "2", "3", "4", "5"));
Stream
.map(i -> {
if (itemList1.contains(i)) {
System.out.println((String) i + 1);
}
return i;
});
itemList.add("6");
itemList1.add("6");
// itemList1 = Arrays.asList(1, 2,3); 这不执行了会破坏掉itemList1中存储的类型 导致在终端求值的时候包类转换异常
limit.limit(20)
.collect(Collectors.toList());