2 回答

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

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