[英]Using Java Predicate and Lambda
為什么下面的代碼返回Predicate<String>
而不是boolean
?
我的理解是這里的!s.isEmpty()
檢查與 Predicate boolean test(T t);
這里的返回類型是boolean
。
所以在我的 lambda 中,我的nonEmptyStringPredicate
不應該是boolean
類型嗎? 顯然,它不是,我只是想了解為什么不是。
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
在這種情況下, Predicate
獲取String
作為參數並返回boolean
。 如果我們不把它寫成 lambda,它看起來像這樣:
Predicate<String> somePredicate = new Predicate<String>() {
@Override
public boolean test(String string) {
return !string.isEmpty();
}
};
如果你真的願意從Predicate
得到一個布爾值,你可以使用它的test
方法:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean val = nonEmptyStringPredicate.test("any"); // true
另一方面, Predicate
只是一個FunctionalInterface
,您使用 lambda 表達式表示。
Lambda 就像一個匿名類,所以這個:
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
就好像:
Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
public boolean test(String s) {
return !s.isEmpty();
}
}
為什么下面的代碼返回 Predicate 而不是布爾值?
這是因為函數的類型(String s) -> !s.isEmpty()
是Predicate<String>
,此時您只是定義了一個函數(它說“給定一個字符串作為輸入返回一個布爾值指示它是否為空)。
請注意,此時您沒有評估任何內容,因此結果不是 boolean 而是function 。
文檔中 FI 的定義:
函數式接口為 lambda 表達式和方法引用提供目標類型。 每個函數式接口都有一個抽象方法,稱為該函數式接口的函數式方法,lambda 表達式的參數和返回類型與之匹配或適應。 函數式接口可以在多個上下文中提供目標類型,例如賦值上下文、方法調用或強制轉換上下文:
為了獲得您正在尋求的“布爾結果”,您必須首先調用“功能方法”。 例子:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test("");
謂詞總是返回一個布爾值,所以這里唯一有趣的值是輸入參數,它是一個字符串。
請參閱: https : //docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html
它返回一個謂詞,因為在左側,您將謂詞聲明為返回類型,而在右側,您將返回 Predicate 的test()
方法的實現。 當您的代碼返回一個作為功能接口實現的對象時(如您的情況),您只需返回其單個抽象方法的邏輯,在本例中為test()
所以基本上就像您正在返回: Predicate<String> nonEmptyStringPredicate = new Predicate { @Override boolean test(String input) { return input.isEmpty() } }
當你寫代碼時,編譯器“知道” !s.isEmpty()
是方法test
的邏輯,它基本上告訴你“嘿給我邏輯,我不需要樣板代碼”順便說一句是使用方法引用的好習慣,你可以用!String::isEmpty
替換!s.isEmpty()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.