簡體   English   中英

使用 Java 謂詞和 Lambda

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM