ラムダオブジェクトを返す値のメソッド呼び出し

アンナ・クライン:

表現this.apply(stringValue)を返すtrueラムダ式にj8Test.PerformChange$$Lambda$2/284720968@2f4d3709

なぜそれがfalseをtrueを返すとしません。そして、なぜdoestそれがすべてでは実際には何を返しますか?(私はタイプPerformChangeImplの他のすべてのオブジェクトの話ではないのです)

private final List<PerformChange> performChangeList = Arrays.asList(
        new PerformChangeImpl("1"),
        new PerformChangeImpl("2"),
        new PerformChangeImpl("3")
);

@FunctionalInterface
interface PerformChange extends Function<String, Boolean> {

    default PerformChange performChange(PerformChange input) {
        System.out.println("1 this: " + this);
        System.out.println("2 input: " + input);
        return stringValue -> {
            System.out.println("\n3 this: " + this);
            System.out.println("4 input: " + input);
            if (this.apply(stringValue)) {
                System.out.println("5 this: " + this);
                return input.apply(stringValue);
            }
            return false;
        };
    }
}

class PerformChangeImpl implements PerformChange {

    private final String value;

    public PerformChangeImpl(String value) {
        this.value = value;
    }

    @Override
    public Boolean apply(String string) {
        System.out.println("\n6: " + this);
        System.out.println("7: " + string);
        return true;
    }

    @Override
    public String toString() {
        return "obj id: " + value;
    }
}

そして

private void executePerformChanges() {
    System.out.println(performChangeList.stream()
            .reduce(PerformChange::performChange)
            .orElse(new PerformChangeImpl("4"))
            .apply("test"));
}

結果

1 this: obj id: 1
2 input: obj id: 2
1 this: j8Test.PerformChange$$Lambda$2/284720968@2f4d3709
2 input: obj id: 3

3 this: j8Test.PerformChange$$Lambda$2/284720968@2f4d3709
4 input: obj id: 3

3 this: obj id: 1
4 input: obj id: 2

6: obj id: 1
7: test
5 this: obj id: 1

6: obj id: 2
7: test
5 this: j8Test.PerformChange$$Lambda$2/284720968@2f4d3709

6: obj id: 3
7: test
true

Process finished with exit code 0
GhostCat敬礼モニカC.:

ここに:

public Boolean apply(String string) {
  ...

あなたのクラスがPerformChangeImpl優先されますapply()メソッドを。それはコアであるFunctionインターフェース。

そして最後に、あなたのコードを呼び出します。

.apply("test"))

そして、内部の非常に最後の文はapply()次のとおりです。

return true;

メソッドが返すtrueあなたがそうすることを告げたので、。あなたはどちらかのリターンにそのメソッド本体を変更する必要がありますので、true/ falseいくつかの条件に基づいて、またはあなたが呼び出すべきではありませんapply()最後に。

ノート:これはprint文から本当に明らかになりました。最後に、あなたが得る67あなたが内に印刷され、apply()PerformChangeImplクラス。

また、注意してください:あなたの不履行方法で行います。

if(this.apply(stringValue)) { 

その呼び出しapply()「周囲」にPerformChangeImpl...と返されますtrue

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=312913&siteId=1