インタフェースStreamable:どのように空()メソッドが返す反復処理可能?

ラジWadhwa:
@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>

おすすめ

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