实话说,jdk8出来好久了,公司一直用的还是jdk7,没有升级,最近终于升级到jdk8了,所以来自己改改代码,使用jdk8中的新特性,最简单的forEach先来试试
测试代码如下:
public static void testJDK8ForEach(){
List<String> 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 很明显不能满足要求。
说到底,改进是很好的,但是还是看具体的需求,各取所需吧,配合使用