以下のコードがboolean
ではなく_Predicate<String>
_を返すのはなぜですか?
私の理解では、ここでの!s.isEmpty()
チェックは述語boolean test(T t);
に反しています。ここでの戻り値の型はboolean
です。
だから私のラムダでは私のnonEmptyStringPredicate
はboolean
のタイプではないのですか?明らかに、そうではありません。なぜそうでないのかを理解しようとしているだけです。
_Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
_
この場合、Predicate
はString
をパラメーターとして取得し、boolean
を返します。ラムダとして記述しない場合、次のようになります。
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は匿名クラスのようなものなので、次のようになります。
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
のようなものです:
Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
public boolean test(String s) {
return !s.isEmpty();
}
}
以下のコードがブールではなく述語を返すのはなぜですか?
function(String s) -> !s.isEmpty()
はPredicate<String>
、この時点では、単純にa functionを定義しています(これは、「入力として文字列を指定すると、空かどうかにかかわらずブール値を返します)。
この時点では何も評価していないため、結果はブール値ではなくfunctionであることに注意してください。
ドキュメントからのFIの定義:
関数型インターフェイスは、ラムダ式とメソッド参照のターゲットタイプを提供します。各関数型インターフェイスには、その関数型インターフェイスの関数メソッドと呼ばれる単一の抽象メソッドがあり、ラムダ式のパラメーターと戻り値の型が一致または適合されます。機能インターフェースは、割り当てコンテキスト、メソッド呼び出し、キャストコンテキストなど、複数のコンテキストでターゲットタイプを提供できます。
求めている「ブール結果」を取得するには、まず「関数メソッド」を呼び出す必要があります。例:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test("");
述語は常にブール値を返すため、ここで重要な唯一の値は文字列である入力パラメーターです。
参照: https://docs.Oracle.com/javase/8/docs/api/Java/util/function/Predicate.html