@FunctionalInterface
public interface Streamable<T> extends Iterable<T>, Supplier<Stream<T>>
私は、インタフェースStreamableと私が出会ったことが第一の方法模索してempty()
、次の定義を持つメソッドを。
static <T> Streamable<T> empty() {
return Collections::emptyIterator;
}
Collections::emptyIterator
返しますIterator<T>
が、このメソッドの戻り値の型がありますStreamable<T>
。Streambleは、反復処理可能とサプライヤーはなくIteratorインターフェイスを拡張します。
私はその作業罰金であるかを理解しませんでした。誰かがこれを理解する上で助けに私を喜ばせることはできますか?
私はちょうどここ概念を理解するのに失敗しています。私は、継承がどのように動作するかを知ってるように、この作業である方法を知りたいと思ったが、私はそれを把握することができませんでしだ。私はここで何かが欠けていると思います。
empty()
メソッド参照を返しますCollections::emptyIterator
。
パスのコンパイルこのコードためには、そのメソッド参照は、単一の抽象メソッドに準拠しなければならないStreamable<>
インタフェース。
Collections
さんはemptyIterator()
引数を取らず、返しますIterator<T>
。
Streamable<>
両方を拡張Iterable<T>
し、Supplier<Stream<T>>
それは二つの方法(実装しなければならないことを意味する、iterator()
そしてget()
(それ以外の場合は、機能インタフェースではない))を、それらの一方が抽象ことができません。
Collections
さんは、emptyIterator()
に準拠することができますIterable<T>
s 'のIterator<T> iterator()
署名。
その場合はStreamable<T>
、デフォルトの実装があるSupplier<Stream<T>>
のget()
(そうでない場合は、この方法をStreamable<T>
、機能的なインターフェイスにすることはできません)Collections::emptyIterator
実装できるStreamable<T>
インターフェイスを。
EDIT:あなたが参照した場合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>
。