Given the code fragments:
interface CourseFilter extends Predicate<String> {
public default boolean test(String str) {
return str.equals("Java");
}
}
and
List<String> strs = Arrays.asList("Java", "Java EE", "Java ME");
Predicate<String> cf1 = s -> s.length() > 3;
Predicate cf2 = new CourseFilter() { //line n1
public boolean test(String s) {
return s.contains("Java");
}
};
long c = strs.stream()
.filter(cf1)
.filter(cf2) //line n2
.count();
System.out.println(c);
What is the result?
A.
2
B.
3
C. A compilation error occurs at line n1.
D. A compilation error occurs at line n2.
題解
CourseFilter介面繼承了Predicate介面,並使用Java 8之後新出的預設方法功能來實作Predicate介面的test方法,判斷傳入test方法的參數是否為「Java」字串。
程式第16行,使用Java 8之後新出的Lambda語法來快速實作出Predicate介面的test方法,判斷傳入test方法的參數所參考的字串物件的長度是否大於3。有關Lambda語法的介紹可以參考這篇文章:
程式第17行,使用匿名類別實作CourseFilter介面,再次覆寫已經在CourseFilter介面中用預設方法實作過的test方法,判斷傳入test方法的參數是否包含「Java」子字串。
程式第22行,將集合轉為串流。
程式第23行,保留長度大於3的字串物件,其餘的丟棄。在此所有元素都會被保留。
程式第24行,保留集合中的包含「Java」子字串的字串,其餘的丟棄。在此所有元素都會被保留。
程式第25行,計算集合的元素數量。此時元素數量為3。
程式第26行,輸出集合的元素數量「3」。