3 回答

TA貢獻1848條經驗 獲得超6個贊
為了了解return從該 API 獲取的內容,您可以嘗試將實現可視化為:
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return new Consumer<T>() { // return the complete Consumer implementation
@Override
public void accept(T t) {
Consumer.this.accept(t); // accept current consumer
after.accept(t); // and then accept the 'after' one.
}
};
}
現在把它聯系起來
(T t) -> { accept(t); after.accept(t); }
是一個Consumer返回值,它確保accept首先編輯當前的,然后是提到的那個after。

TA貢獻1836條經驗 獲得超5個贊
一個函數式接口必須只有一個抽象方法。但是,它可以有任意數量的靜態方法和默認方法。的方法Consumer
有:
accept(T)
這是 的單一抽象方法
Consumer
。它接受類型的單個通用參數T
并且不返回任何內容(即void
)。這是由 lambda 表達式或方法引用實現的方法。andThen(Consumer)
這是默認方法。換句話說,它有一個實現,因此是非抽象的。該方法接受一個
Consumer
并返回另一個Consumer
。因為它是一個默認方法,所以單一的抽象方法Consumer
仍然存在accept(T)
。
上面解釋了為什么Consumer
可以有一個方法返回void
. 現在,當談到 的實現時andThen
,重要的是要意識到實際上涉及三個 Consumer
s:
被調用的實例
andThen
。引用的實例
after
。實例返回給調用者。
如果您對代碼進行格式化,那么并非所有內容都在同一行上,這可能更容易理解:
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
// Returns Consumer instance #3. The lambda is the implementation
// of the 'accept' method.
return (T t) -> {
accept(t); // Invokes 'accept' on Consumer instance #1.
after.accept(t); // Invokes 'accept' on Consumer instance #2.
}
}

TA貢獻1818條經驗 獲得超11個贊
我想我理解你的擔憂。您想知道如果返回 voidandThen()
之后為什么可以調用。accept()
accept()
問題是,您首先定義一個Consumer
對象,然后在該實例上調用andThen()
方法。例如:
Consumer<String> consumer = s -> System.out.println(s); consumer.andThen(s -> System.out.println(s.toUpperCase()));
添加回答
舉報