[解決済み】Iterable<T>がstream()とparallelStream()メソッドを提供しないのはなぜですか?
質問
なぜ
Iterable
インターフェースは
stream()
と
parallelStream()
メソッドを使用します。次のようなクラスを考えてみましょう。
public class Hand implements Iterable<Card> {
private final List<Card> list = new ArrayList<>();
private final int capacity;
//...
@Override
public Iterator<Card> iterator() {
return list.iterator();
}
}
を実装したものです。 ハンド トレーディングカードゲームで遊ぶときに手札を持つことができるように。
基本的には
List<Card>
で、最大容量を確保し、他のいくつかの便利な機能を提供します。この機能は、直接
List<Card>
.
さて、便利なように、私は実装するのがいいと思いました
Iterable<Card>
ループさせたい場合は、拡張for-loopを使用することができます。(私の
Hand
クラスはまた
get(int index)
メソッドで、そのため
Iterable<Card>
は正当化されると私は思います)。
は、その
Iterable
インタフェースは以下を提供します(javadocは省きます)。
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
でストリームを取得できるようになりました。
Stream<Hand> stream = StreamSupport.stream(hand.spliterator(), false);
では、本題に入ります。
-
なぜ
Iterable<T>
を実装したデフォルトのメソッドを提供しません。stream()
とparallelStream()
このようなことが不可能になる、あるいは不要になるようなことはないのでしょうか?
関連する質問として、次のようなものを見つけましたが。
なぜ Stream<T> は Iterable<T> を実装していないのですか?
それは奇妙なことに、それを多少なりとも逆に行うことを示唆している。
解決方法は?
これは漏れではなく、2013年6月にEGリストで詳細な議論が行われました。
に、専門家集団の決定的な議論が根付いています。 このスレッド .
というのは、(当初、専門家グループにとっても)自明なことのように思われました。
stream()
には意味があるように思えました。
Iterable
というのは
Iterable
があまりにも一般的であることが問題になりました。なぜなら、明白な署名があるからです。
Stream<T> stream()
は、必ずしも思い通りになるとは限りませんでした。というものもありました。
Iterable<Integer>
は、むしろそのストリームメソッドが
IntStream
といった具合に。 しかし
stream()
メソッドをこのように高い階層に配置すると、それが不可能になります。 そこで、その代わりとして
Stream
から
Iterable
を提供することにより
spliterator()
メソッドを使用します。の実装は
stream()
で
Collection
がちょうどいい。
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
どのクライアントも、欲しいストリームを
Iterable
を使っています。
Stream s = StreamSupport.stream(iter.spliterator(), false);
最終的には
stream()
に
Iterable
は間違いだと思います。
関連
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み] Java 8のmap()メソッドとflatMap()メソッドの違いは何ですか?
-
[解決済み] Java 8 JDK を使用して、Iterable を Stream に変換する
-
[解決済み】Stream<T>がIterable<T>を実装していないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] tempとは何ですか、またjavaにおけるtempの用途は何ですか?
-
[解決済み] java.sql.SQLException: ORA-00933: SQL コマンドが正しく終了していません。
-
[解決済み] 未処理の例外タイプIOException」が表示されるのですが?
-
[解決済み] XX:MaxDirectMemorySizeの既定値
-
[解決済み] 午前0時からの時間を秒単位で取得する方法
-
[解決済み] IntegerからBigIntegerへの変換
-
[解決済み] x--やx++はここで何をするのですか?
-
[解決済み] IteratorをStreamに変換するには?
-
[解決済み] Java 8 JDK を使用して、Iterable を Stream に変換する
-
[解決済み】Stream<T>がIterable<T>を実装していないのはなぜですか?