2 回答

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊
empty()
返回一個(gè)方法引用Collections::emptyIterator
。
為了使此代碼通過編譯,該方法引用必須符合接口的單個(gè)抽象方法Streamable<>
。
Collections
不emptyIterator()
接受任何參數(shù)并返回一個(gè)Iterator<T>
.
Streamable<>
擴(kuò)展了Iterable<T>
和Supplier<Stream<T>>
,這意味著它必須實(shí)現(xiàn)兩個(gè)方法(iterator()
和get()
),但其中一個(gè)不能是抽象的(否則它就不是函數(shù)式接口)。
Collections
的emptyIterator()
可以符合Iterable<T>
的Iterator<T> iterator()
簽名。
因此,如果Streamable<T>
有一個(gè)默認(rèn)實(shí)現(xiàn)的Supplier<Stream<T>>
方法get()
(如果沒有,Streamable<T>
則不能是功能接口),Collections::emptyIterator
可以實(shí)現(xiàn)該Streamable<T>
接口。
編輯:如果您指的是org.springframework.data.util.Streamable,您可以看到它確實(shí)有一個(gè)默認(rèn)實(shí)現(xiàn)get()
:
/*
?* (non-Javadoc)
?* @see java.util.function.Supplier#get()
?*/
default Stream<T> get() {
? ? return stream();
}
因此,任何符合單一抽象方法的方法引用都Iterator<T> iterator()可以實(shí)現(xiàn)該接口。因此Collections::emptyIterator可以實(shí)施Streamable<T>。

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
作為記錄,這是完全限定的名稱 :?org.springframework.data.util.Streamable
。
問題是在當(dāng)前上下文中:
static <T> Streamable<T> empty() {? ??
? ? return Collections.emptyIterator();
}
與以下內(nèi)容不同:
static <T> Streamable<T> empty() {? ??
? ? return Collections::emptyIterator;
}
return Collections.emptyIterator()返回一個(gè)Iterator對象,而該方法需要一個(gè)Streamable. 那確實(shí)不能像你想象的那樣編譯。
但return Collections::emptyIterator不返回Iterator對象。Streamable相反,它定義了與返回的功能接口對象關(guān)聯(lián)的 lambda 主體empty()。
其實(shí)這個(gè)方法參考:
return Collections::emptyIterator;
相當(dāng)于:
return () -> Collections.emptyIterator();
為什么有效?
因?yàn)镾treamable是定義為函數(shù)的功能接口:()-> Iterator<T> 并emptyIterator()返回Iterator<T>。
添加回答
舉報(bào)