Java8內置的函數式接口


JDK 1.8 API 包含了很多內置的函數式接口。其中就包括我們在老版本中經常見到的 Comparator 和 Runnable,Java 8 為他們都添加了 @FunctionalInterface 注解,以用來支持 Lambda 表達式。

值得一提的是,除了 ComparatorRunnable 外,還有一些新的函數式接口,它們很多都借鑒於知名的 Google Guava 庫。

對於它們,即使你已經非常熟悉了,還是最好了解一下的:

 

 

Predicate 斷言

Predicate 是一個可以指定入參類型,並返回 boolean 值的函數式接口。它內部提供了一些帶有默認實現的方法,可以 被用來組合一個復雜的邏輯判斷andornegate):

Predicate<String> predicate = (s) -> s.length() > 0;

predicate.test("foo");              // true
predicate.negate().test("foo");     // false

Predicate<Boolean> nonNull = Objects::nonNull;
Predicate<Boolean> isNull = Objects::isNull;

Predicate<String> isEmpty = String::isEmpty;
Predicate<String> isNotEmpty = isEmpty.negate();

 

 

Function

Function 函數式接口的作用是,我們可以為其提供一個原料,他給生產一個最終的產品。通過它提供的默認方法,組合,鏈行處理(composeandThen):

Function<String, Integer> toInteger = Integer::valueOf;
Function<String, String> backToString = toInteger.andThen(String::valueOf);

backToString.apply("123");     // "123"

 

 

Supplier 生產者

Supplier 與 Function 不同,它不接受入參,直接為我們生產一個指定的結果,有點像生產者模式:

class Person {
    String firstName;
    String lastName;

    Person() {}

    Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

 

Supplier<Person> personSupplier = Person::new;
personSupplier.get();   // new Person

 

 

Consumer 消費者

對於 Consumer,我們需要提供入參,用來被消費,如下面這段示例代碼:

class Person {
    String firstName;
    String lastName;

    Person() {}

    Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

 

Consumer<Person> greeter = (p) -> System.out.println("Hello, " + p.firstName);
greeter.accept(new Person("Luke", "Skywalker"));

 

 

Comparator

Comparator 在 Java 8 之前是使用比較普遍的。Java 8 中除了將其升級成了函數式接口,還為它拓展了一些默認方法:

Comparator<Person> comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName);

Person p1 = new Person("John", "Doe");
Person p2 = new Person("Alice", "Wonderland");

comparator.compare(p1, p2);             // > 0
comparator.reversed().compare(p1, p2);  // < 0

 

 

 

來源:https://www.exception.site/java8/java8-new-features#consumer-%E6%B6%88%E8%B4%B9%E8%80%85


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM