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」。