# Consumer、Function、Predicate與Supplier ```java= public class Test { public static void main(String[] args) { List<String> nL = Arrays.asList("Jim","John","Jeff"); Function<String,String> funVal = s->"Hello:".concat(s); nL.stream().map(funVal).peek(System.out::print); } } ``` **Console: 不會顯示任何結果** ```Console= ``` **因為peek 操作接收的是一個 Consumer 函數。** :::info JDK8定義的通用函式介面,基本上置放於java.util.function套件之中,就行為來說,基本上可以分為**Consumer、Function、Predicate與Supplier**四種。 --- #### Consumer 如果需要的行為是接受一個參數,然後處理後不傳回值,就可以使用Consumer介面,它的定義是: ```java= public interface Consumer<T> { void accept(T t); } ``` **例如: forEach() , peek()** --- #### Function 如果需要的是接受一個參數,然後以該參數進行計算後傳回結果,就可以使用Function介面,它的定義是: ```java= public interface Function<T, R> { R apply(T t); } ``` **例如: map()** --- #### Predicate 如果接受一個參數,然後只傳回boolean值,也就是根據傳入的參數直接判斷真假的行為,就可以使用Predicate函式介面,其定義為: ```java= public interface Predicate<T> { boolean test(T t); } ``` **例如: filter()** --- #### Supplier 如果需要的行為是不接受任何參數,然後傳回值,那可以使用Supplier函式介面: ```java= public interface Supplier<T> { T get(); } ``` **範例:** ```java= supplier = () -> new Random().nextInt(); System.out.println(supplier.get()); ``` ::: **回到本題,如果要讓peek可以正常運作把值印出來,程式修改如下:** ```java= public static void main(String[] args) { List<String> nL = Arrays.asList("Jim","John","Jeff"); Function<String,String> funVal = s->"Hello:".concat(s); nL.stream().map(funVal).peek(System.out::print).collect(Collectors.toList()); } ``` **加上collect之後的Console:** ```Console= Hello:JimHello:JohnHello:Jeff ``` --- ## BiPredicate 、 BiFunction **Question:** ```java= public static void main(String[] args) { BiPredicate<String,String> bp = (String s1,String s2) -> s1.contains("SG") && s2.contains("Java"); BiFunction<String, String, Integer> bf = (String s1,String s2) -> { int fee = 0; if(bp.test(s1, s2)) { fee = 100; } return fee; }; int fee1 = bf.apply("D101SG", "Java Programming"); System.out.println(fee1); } ``` ### What is the result? A. A compilation error occurs at line 7. **B. 100** C. A compilation error occurs at line 8. D. A compilation error occurs at line 15. - [x] **Answer: B** **BiPredicate、BiFunction 就是變成輸入兩個參數** ###### tags: `ocpjp`