jdk8中forEach使用问题

实话说,jdk8出来好久了,公司一直用的还是jdk7,没有升级,最近终于升级到jdk8了,所以来自己改改代码,使用jdk8中的新特性,最简单的forEach先来试试

测试代码如下:

public static void testJDK8ForEach(){
		List asList = Arrays.asList("a","b","a","d");
		int i=0;
		// jdk7 for
		for(String s:asList){
			if(s.equals("a")){
				++i;
			}
		}
		//2  jdk8 forEach
		asList.forEach(s -> {
			if(s.equals("a")){
				++i;  // Local variable i defined in an enclosing scope must be final or effectively final
			}
		});
		System.out.println(i);
		//3  jdk8 stream
		long count = asList.stream().filter(s -> s.equalsIgnoreCase("a")).count();
		System.out.println(count);
	}

首先forEach 的确很好用,配合lambda表达式,遍历起来很方便。

但是对于上述代码中的//2  提示 变量i 应该final修饰,或者 实际的final效果,也就是内容部不可变。其实可以理解,lambda 实际上 是 匿名内部类的一种特殊用法 所以 这样写 肯定有final问题。

其实 //2  就是 //1 中的改进方法而已, jdk8中的forEach本来就是对jdk7中的for的更好的封装,但是对于上述需求,jdk8中的forEach 很明显不能满足要求。

说到底,改进是很好的,但是还是看具体的需求,各取所需吧,配合使用

你可能感兴趣的:(java)