函數式接口定義且只定義了一個
抽象方法.函數式接口的抽象方法的簽名稱為函數描述符
。
Java 8的java.util.function
包中引入了幾個新的函數式接口。
1.Predicate
java.util.function.Predicate<T>
接口定義了一個名叫 test 的抽象方法,它接受泛型 T對象,並返回一個 boolean 。
在需要表示一個涉及類型T的布爾表達式時,就可以使用這個接口。
比如,可以定義一個接受 String對象的 Lambda表達式,如下所示。
@FunctionalInterface public interface Predicate<T>{ boolean test(T t); } public static <T> List<T> filter(List<T> list, Predicate<T> p) { List<T> results = new ArrayList<>(); for(T s: list){ if(p.test(s)){ results.add(s); } } return results; } Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty(); List<String> nonEmpty = filter(listOfStrings, nonEmptyStringPredicate);
2.Consumer
java.util.function.Consumer<T> 定義了一個名叫 accept的抽象方法,它接受泛型 T的對象,沒有返回(void).
如果需要訪問類型 T的對象,並對其執行某些操作,就可以使用這個接口。比如,可以用它來創建一個 forEach 方法,接受一個 Integers的列表,並對其中每個元素執行操作。
在下面的代碼中,就可以使用這個forEach方法,並配合 Lambda來打印列表中的所有元素。
@FunctionalInterface public interface Consumer<T>{ void accept(T t); } public static <T> void forEach(List<T> list, Consumer<T> c){ for(T i: list){ c.accept(i); } } forEach(Arrays.asList(1,2,3,4,5),(Integer i) -> System.out.println(i));
3.Function
java.util.function.Function<T, R>接口定義了一個叫作 apply的方法,它接受一個泛型 T的對象,並返回一個泛型 R的對象。
如果需要定義一個 Lambda ,將輸入對象的信息映射到輸出,就可以使用這個接口(比如提取蘋果的重量,或把字符串映射為它的長度)。
在下面的代碼中,展示如何利用它來創建一個map方法,以將一個String列表映射到包含每個String長度的Integer列表。