1. 程式人生 > >jdk8中forEach使用問題

jdk8中forEach使用問題

實話說,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 很明顯不能滿足要求。

說到底,改進是很好的,但是還是看具體的需求,各取所需吧,配合使用