Q001
NO.1 Which code is correct?
A. Runnable r = "Message" -> System.out.println();
B. Runnable r = () -> System.out::print;
C. Runnable r = () -> {System.out.println("Message");};
D. Runnable r = -> System.out.println("Message");
E. Runnable r = {System.out.println("Message")};
Answer: C
Lambda 無參數或多個參數,都要加 ()。
表示式只有一行且有 return ,可以不加 {}。
表示式只有一行且有返回值,無{} 不能加 return。有 {} 要加 return
表示式只有一行且無返回值,有無 {} 都可以。
Consumer<輸入型別> 無返回值,使用 accept 傳入參數,比如
Consumer<String> c = s-> System.out.println(s);
c.accept("Hello");
Function<輸入型別, 返回型別>,使用 apply 傳入參數並取回值,比如
Function<String, Integer> f = s -> s.length();
System.out.println(f.apply("Hello");
Q002
NO.6 Given the code fragment:
9. Integer[] ints = {1, 2, 3, 4, 5, 6, 7};
10. var list = Arrays.asList (ints) ;
11. UnaryOperator<Integer> uo = x -> x * 3;
12. list.replaceAll(uo);
Which two can replace line 11?
A. UnaryOperator<Integer> uo = (var x) -> (x * 3);
B. UnaryOperator<Integer> uo = var x -> { return x * 3;};
C. UnaryOperator<Integer> uo = x -> { return x * 3;};
D. UnaryOperator<Integer> uo = (int x) -> x * 3;
Answer: AC
UnaryOperator<T> 是 Function<T , T>的特殊化,也就是輸入參數型與返回型態要一樣。
第 11 行 指定資料格式為泛型 Integer,而答案 D 將 x 轉成 int,所以 x*3 的返回值亦為 int,而不是 Integer,所以 D 是錯誤的。
