关于java8 stream中需要使用final变量的思考

2025-06-19 23:44:08

关于java8 stream中需要使用final变量的思考

关于final的使用final 变量final 方法final 类

关于不能使用final的解释

关于final的使用

final 变量

final 限制的变量可以是基础数据类型和引用数据类型 基本数据类型:内容不可变 引用数据类型:引用的指向不可变,执行的对象的值可以改变。例如

public static void main(String[] args) {

final List list = new LinkedList<>();

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 = 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 limit = itemList.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 limit = itemList.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());

筑梦山西“晋”鲤福利
国足12强赛后怎么进世界杯?还需两步,或能遇到桑切斯、纳瓦斯