JDK 1.8 API 包含了很多內置的函數式接口。其中就包括我們在老版本中經常見到的 Comparator 和 Runnable,Java 8 為他們都添加了 @FunctionalInterface 注解,以用來支持 Lambda 表達式。
值得一提的是,除了 Comparator 和 Runnable 外,還有一些新的函數式接口,它們很多都借鑒於知名的 Google Guava 庫。
對於它們,即使你已經非常熟悉了,還是最好了解一下的:
Predicate 斷言
Predicate 是一個可以指定入參類型,並返回 boolean 值的函數式接口。它內部提供了一些帶有默認實現的方法,可以 被用來組合一個復雜的邏輯判斷(and, or, negate):
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 函數式接口的作用是,我們可以為其提供一個原料,他給生產一個最終的產品。通過它提供的默認方法,組合,鏈行處理(compose, andThen):
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
