1

constructor(collection)またはメソッドへの引数として指定することで、リストにコレクションを追加できます.addAll(Collection)。でも、Iterator/Iterableそれで十分でしょう。デザイナーが基本原則に従いたいと思った場合: 送信するものにはリベラルであり、受け入れるものには保守的である場合、デザイナーは を受け入れる必要がありListますArrayList。では、なぜ彼らは途中でやめることを好んだのでしょうか?

「列挙子には Collection.list があるのに Iterable/Iterator にはなぜないのか」という同様の質問があり、非常に評判の良い人が、これは歴史的な理由によるものであり、 .addAll で回避できると答えていますaddAllしかし、彼/彼女が何について話しているのかわかりません。ここで、addAllIterable/Iterator では機能しないことがわかっているので、正確に質問します。

4

4 に答える 4

11

歴史: addAll()Java 1.2 で追加され、IterableJava 5 に付属しています。

SDK を実行している人々には、次のオプションがありました。

  1. 既存の API を置き換える (多くのコードが壊れる可能性がある) または

  2. addAll(Iterable)多くのコードを壊す可能性のある 2 番目を追加します。

  3. コードを壊すことはありませんが、多くの人を悩ませます。

「既存のコードを壊さないこと」は「人々を幸せにすること」よりも優先度が高いため、彼らはそうしました。

于 2013-09-02T15:51:29.990 に答える
2

Eclipse コレクションの可変コンテナーには、メソッドがありaddAllIterable(Iterable)ます。

MutableList<Integer> list = FastList.newListWith(1, 2, 3);
Iterable<Integer> iterable = FastList.newListWith(4, 5, 6);
list.addAllIterable(iterable);
Assert.assertEquals(FastList.newListWith(1, 2, 3, 4, 5, 6), list);

注:私は Eclipse コレクションのコミッターです。

于 2013-09-03T01:40:09.960 に答える
2

このインターフェースは、強化されたループIterableが導入された Java 5 (1.5) まで追加されませんでした。1.2 での Collections API の導入に戻ります。foraddAll

addAll(Iterator i)メソッドを持つことは理にかなっているように思えます。デザイナーがそうしないことを選んだ理由はわかりません。Guava は s を喜んで受け入れIteratorます。

于 2013-09-02T15:49:16.860 に答える
2

addAllに追加されたときはインターフェースCollectionがなかっIterableたので、その時点では追加できませんでした。後で追加できたかもしれませんが、むしろ Iterface を埋めて、同様の機能を持つ実装が含まれていませんでした。

ところでIterable、JDK のすべてはコレクションです。Iterablefor-each ループをサポートするためにAFAIKが追加されました。

あなたはJava 1.2で持っていた可能性があります

public void addAll(Collection);
public void addAll(Iterator);
public void removeAll(Collection);
public void removeAll(Iterator);
public void retainAll(Collection);
public void retainAll(Iterator);

しかし、あなたは持っているでしょう

  • 引数を変更するメソッドを追加しました。addAll(Collection) はコレクションを変更しません。
  • 紛らわしいと思われる同様のことを行うメソッドの数を 2 倍にしました。たとえば、署名されていないプリミティブを削除して、同様の構造の数のオプションを最小限に抑えました
  • 当時、イテレータの操作は自然とは見なされていませんでした (Java 8 のストリームを参照)。
  • xxxAll(Iterator) を単独で使用すると、一般的なケースが複雑になるため、これは望ましくありません。
于 2013-09-02T15:50:26.193 に答える