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

关于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());

你可能感兴趣的:(java基础)