web-dev-qa-db-ja.com

Java述語とラムダを使用する

以下のコードがbooleanではなく_Predicate<String>_を返すのはなぜですか?

私の理解では、ここでの!s.isEmpty()チェックは述語boolean test(T t);に反しています。ここでの戻り値の型はbooleanです。

だから私のラムダでは私のnonEmptyStringPredicatebooleanのタイプではないのですか?明らかに、そうではありません。なぜそうでないのかを理解しようとしているだけです。

_Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
_
8
Taobitz

この場合、PredicateStringをパラメーターとして取得し、booleanを返します。ラムダとして記述しない場合、次のようになります。

Predicate<String> somePredicate = new Predicate<String>() {
    @Override
    public boolean test(String string) {
        return !string.isEmpty();
    }
};
7
CodeMatrix

本当にPredicateからブール値を取得したい場合は、その test メソッドを使用できます。

Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean val = nonEmptyStringPredicate.test("any"); // true

Predicate 一方、ラムダ式を使用して表した FunctionalInterface は単なるものです。

4
Naman

Lambdaは匿名クラスのようなものなので、次のようになります。

Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();

のようなものです:

Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
    public boolean test(String s) {
        return !s.isEmpty();
    }
}
2
M314

以下のコードがブールではなく述語を返すのはなぜですか?

function(String s) -> !s.isEmpty()Predicate<String>、この時点では、単純にa functionを定義しています(これは、「入力として文字列を指定すると、空かどうかにかかわらずブール値を返します)。

この時点では何も評価していないため、結果はブール値ではなくfunctionであることに注意してください。

ドキュメントからのFIの定義:

関数型インターフェイスは、ラムダ式とメソッド参照のターゲットタイプを提供します。各関数型インターフェイスには、その関数型インターフェイスの関数メソッドと呼ばれる単一の抽象メソッドがあり、ラムダ式のパラメーターと戻り値の型が一致または適合されます。機能インターフェースは、割り当てコンテキスト、メソッド呼び出し、キャストコンテキストなど、複数のコンテキストでターゲットタイプを提供できます。

求めている「ブール結果」を取得するには、まず「関数メソッド」を呼び出す必要があります。例:

Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test(""); 
1
Ousmane D.

述語は常にブール値を返すため、ここで重要な唯一の値は文字列である入力パラメーターです。

参照: https://docs.Oracle.com/javase/8/docs/api/Java/util/function/Predicate.html

0
comrad