web-dev-qa-db-ja.com

Lists.newArrayListと新しいArrayList

文字列のListを作成するための最適な構成は何ですか? Lists.newArrayList()(グアバから)またはnew ArrayList()ですか?

個人的な好みですか?
またはそれは単なる型ジェネリック型推論ですか?
またはLists.newArrayList()の使用に理論的または実用的な価値はありますか?

68
asela38

Guava builderは、型引数を複数回入力する手間を省きます。比較する:

List<Foo<Bar, Baz>> list = Lists.newArrayList();
List<Foo<Bar, Baz>> list = new ArrayList<Foo<Bar, Baz>>();

Java 7では、ダイヤモンド演算子を使用しているため、少し時代遅れです。

List<Foo<Bar, Baz>> list = new ArrayList<>();
87
Bozho

グアバのソース から:

public static <E> ArrayList<E> newArrayList() {
    return new ArrayList<E>();
}

実行しているのは、型推論を許可することだけです。実行時に違いはありません。

29
Paul Bellora

1つ追加しますオーバーロード Lists.newArrayList()のバージョンがより便利です:

  • Lists.newArrayList(E... elements)
  • Lists.newArrayList(Iterable<? extends E> elements)
  • Lists.newArrayList(Iterator<? extends E> elements)

new ArrayList()よりも便利な関数を提供します。

例えば:new ArrayList()はできません:

Lists.newArrayList("a","b");
Lists.newArrayList(anIterable);

これがLists.newArrayListの機能です。

@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList() {
    return new ArrayList<E>();
}

したがって、これら2つは基本的に同じであり、newArrayListを使用すると、ジェネリック型を複製する必要がないという利点があります。これは、複雑なジェネリックで非常に役立ちます。

List<Map<X,List<Y>> list = new ArrayList<Map<X,List<Y>>();

List<Map<X,List<Y>> list = Lists.newArrayList();
4
phlogratos

here で説明したように、ListsSetsなどを使用する主な動機は、コードの可読性/複製を改善し、型推論を行うことです。

3
darrengorman

オーバーロードされたコンストラクターのJava 8アプローチ。

Guavaのオーバーロードコンストラクターを使用する場合は、Java 8 Stream Builder。

List<String> listTest = Stream.<String>builder.add("Hello").add("My Name").add("Blah").build().collect(Collectors.toList());
2
Rituraj

前述のように、Java 7はこれを廃止しますが、リスト、セット、マップなどを後で簡単に変更できるようにするため、ファクトリメソッドを使用します。

1
daveb