jdk8中forEach使用問題
阿新 • • 發佈:2019-01-02
實話說,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 很明顯不能滿足要求。
說到底,改進是很好的,但是還是看具體的需求,各取所需吧,配合使用