Java Lambda基礎——Function, Consumer, Predicate, Supplier, 及FunctionalInterface介面

Morven.Huang發表於2018-12-13

這幾個介面經常與Lambda結合使用,網上當然也有很多介紹,不過有些過於繁瑣,有些又偏簡單,秉著實用主義精神,今天這裡折中一下,把介紹的內容分為兩部分,第一部分相當於TLDR,總結幾個“口訣”,便於大家記憶,對於更想看用法示例的同學們,第二部分者提供了所有這些介面的示例。希望對大家有所幫助。

口訣

    如無引數,請使用Supplier(Use Supplier if it takes nothing)

    如無返回,請使用Consumer(Use Consumer if it returns nothing)

    如兩者都無,請使用Runnable(Use Runnable if it does neither)

    如兩者都有,請使用Function(Use Function if it does both)

    如返回布林值,請使用Predicate(Use Predicate if it returns a boolean)

    如以上皆不可以,請使用自定義@FunctionalInteface(Use @FunctionalInteface if none of above works)

示例

  1. Supplier
private static <T> testSupplier(Supplier<T> supplier) {
    return supplier.get();
}
...
Integer s = testSupplier(() -> 7 + 3); // 不接受任何引數,但會返回資料
System.out.println(s); // 輸出10
  1. Consumer
private static <T> void testConsumer(Consumer<T> consumer, T data) {
    consumer.accept(data);
}
...
testConsumer(System.out::println, "dummy"); // 直接呼叫println,輸出"dummy",無任何返回
  1. Runnable
private static void testRunnable(Runnable runnable) {
    runnable.run();
}
...
testRunnable(() -> System.out.println("dummy")); // 既無輸入,也無輸出
  1. Function
private static <T, R> testFunction(Function<T, R> function, T data) {
    return function.apply(data);
}
...
Integer f = testFunction((d) -> d * 23); // 既有輸入,也有輸出(將給定值X2)
System.out.println(f); // 輸出6
  1. Predicate
private static <T> boolean testPredicate(Predicate<T> predicate, T data) {
    return predicate.test(data);
}
...
boolean p = testPredicate((d) -> d > 0100); // 接受輸入,輸出布林值(判斷給定值是否為正數)
System.out.println(p); // 輸出true
  1. @FunctionalInterface
@FunctionalInterface
public interface CalculationFuncInterface<TUR{
    public R apply(T l, U i);
}
...
private static <T, U, R> testFunctionalInterface(CalculationFuncInterface<T, U, R> cal, T data1, U data2) {
    return cal.apply(data1, data2);
}
...
Integer fi = testFunctionalInterface((a, b) -> a * b, 67); // 接受兩個輸入引數,並返回其乘積
System.out.println(fi); // 輸出42

今天的介紹就先到這,感謝大家,Cheers!



公眾號“程式設計師雜書館”,歡迎關注。免費送出O'Reilly《Spark快速大資料分析》紙質書(亦有一批PDF分享)!
Java Lambda基礎——Function, Consumer, Predicate, Supplier, 及FunctionalInterface介面Java Lambda基礎——Function, Consumer, Predicate, Supplier, 及FunctionalInterface介面

相關文章