Java函數式接口


函數式接口 定義且只定義了一個抽象方法.函數式接口的抽象方法的簽名稱為 函數描述符
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列表。

@FunctionalInterface
public interface Function<T, R>{
    R apply(T t);
}
public static <T, R> List<R> map(List<T> list,
Function<T, R> f) {
    List<R> result = new ArrayList<>();
    for(T s: list){
        result.add(f.apply(s));
    }
    return result;
}
// [7, 2, 6]
List<Integer> l = map(Arrays.asList("lambdas","in","action"),(String s) -> s.length());


免責聲明!

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



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