テスト目的でオプションのリストを作成したいです。最初に、私はこれをしました:
ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");
それから私は次のようにコードをリファクタリングしました:
ArrayList<String> places = new ArrayList<String>(
Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
これを行うより良い方法はありますか?
実際には、ArrayList
を初期化するための「最善の」方法は、あなたが書いた方法です。新しいList
を作成する必要はまったくないからです。
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
そのキャッチは、そのlist
インスタンスを参照するのに必要なタイピングがかなりあるということです。
インスタンス初期化子を使って匿名の内部クラスを作ること( "二重括弧の初期化"としても知られる)のような代替手段があります。
ArrayList<String> list = new ArrayList<String>() {{
add("A");
add("B");
add("C");
}};
しかし、私はそのメソッドがあまり好きではありません。インスタンス初期化子を持つArrayList
のサブクラスであり、そのクラスは1つのオブジェクトを作成するためだけに作成されるためです。 。
コレクションリテラルの提案 for Project Coin が受け入れられればいいのですが(Java 7で導入される予定でしたが、Java 8の一部になる可能性は低いです) ):
List<String> list = ["A", "B", "C"];
残念ながら、ここでは役に立ちません。なぜならそれはList
ではなく不変のArrayList
を初期化するでしょうし、さらに、まだ利用可能になっていない場合はまだ利用できません。
単にList
として宣言するのであれば、もっと簡単です - それはArrayListである必要がありますか?
List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");
要素が1つしかない場合
List<String> places = Collections.singletonList("Buenos Aires");
これはplaces
が immutable であることを意味します(これを変更しようとするとUnsupportedOperationException
例外がスローされます)。
具体的なArrayList
である可変リストを作るためには、不変リストからArrayList
を作成することができます。
ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
Java 10、11、12、またはそれ以降の場合:
var strings = List.of("foo", "bar", "baz");
Java 9以降の場合
List<String> strings = List.of("foo", "bar", "baz");
これはあなたに不変のList
を与えるので、それを変更することはできません。
これは、事前入力しているほとんどの場合に必要なものです。
List<String> strings = Arrays.asList("foo", "bar", "baz");
これは配列に裏付けられたList
を与えるので、長さを変えることはできません。
しかし、あなたはList.set
を呼び出すことができるので、それはまだ変更可能です。
静的インポートを使うとArrays.asList
をさらに短くすることができます。
List<String> strings = asList("foo", "bar", "baz");
静的インポート
import static Java.util.Arrays.asList;
どんな現代的なIDEがあなたのために自動的に提案してくれるでしょう。
例えばIntelliJ IDEAでは、Alt+Enter
を押してStatic import method...
を選択します。
しかし、Java 9のList.of
メソッドを短くすることはお勧めしません。なぜなら、of
だけを持つことは混乱を招くからです。List.of
はすでに十分短く、よく読んでいます。
Stream
sを使うなぜそれがList
でなければならないのですか?
Java 8以降では、もっと柔軟なStream
を使うことができます。
Stream<String> strings = Stream.of("foo", "bar", "baz");
Stream
sを連結することができます:
Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
Stream.of("baz", "qux"));
あるいはStream
からList
へ行くこともできます。
import static Java.util.stream.Collectors.toList;
List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());
しかし、できればStream
にまとめずにList
を使うようにしてください。
Java.util.ArrayList
を必要とする場合(あなたはおそらくそうではありません。)
引用するには JEP 269 (私の強調):
可変コレクションインスタンスを事前定義された値のセットで初期化するための 小さなセット のユースケースがあります。通常、これらの事前定義された値を不変コレクションに入れてから、コピーコンストラクターを介して可変コレクションを初期化することをお勧めします。
後でbothを追加してArrayList
andを追加したい場合(なぜですか?)
ArrayList<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");
またはJava 8以前の場合
ArrayList<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");
あるいはStream
を使う:
import static Java.util.stream.Collectors.toCollection;
ArrayList<String> strings = Stream.of("foo", "bar")
.collect(toCollection(ArrayList::new));
strings.add("baz");
しかし、やはり、Stream
にまとめるのではなく、直接List
を直接使用する方が得策です。
あなたはあなたのコードでリストをArrayList
として宣言したと述べましたが、あなたがArrayList
のメンバーでないList
のメンバーを使っている場合にのみそうすべきです。
どちらをしていないのでしょう。
通常は、使用する予定の最も一般的なインターフェース(例:Iterable
、Collection
、またはList
)で変数を宣言し、特定の実装(例:ArrayList
、LinkedList
またはArrays.asList()
)で初期化するだけです。
そうでなければ、あなたはあなたのコードをその特定のタイプに制限し、そしてあなたが望むときにそれを変更するのは難しいでしょう。
たとえば、ArrayList
をvoid method(...)
に渡すとします。
// Iterable if you just need iteration, for (String s : strings):
void method(Iterable<String> strings) {
for (String s : strings) { ... }
}
// Collection if you also need .size(), .isEmpty(), or .stream():
void method(Collection<String> strings) {
if (!strings.isEmpty()) { strings.stream()... }
}
// List if you also need .get(index):
void method(List<String> strings) {
strings.get(...)
}
// Don't declare a specific list implementation
// unless you're sure you need it:
void method(ArrayList<String> strings) {
??? // You don't want to limit yourself to just ArrayList
}
もう1つの例は、変数が通常InputStream
またはFileInputStream
であるにもかかわらず、常に変数をBufferedInputStream
と宣言することです。近いうちにあなたや他の人が他の種類のInputStream
を使いたいと思うからです。
サイズ1の単純なリストが必要な場合は、
List<String> strings = new ArrayList<String>(Collections.singletonList("A"));
複数のオブジェクトのリストが必要な場合は、
List<String> strings = new ArrayList<String>();
Collections.addAll(strings,"A","B","C","D");
コレクションリテラルでJava 8にすることはできませんでしたが、Stream APIを使ってリストを1行で初期化することは可能です。
List<String> places = Stream.of("Buenos Aires", "Córdoba", "La Plata").collect(Collectors.toList());
あなたのList
がArrayList
であることを確認する必要があるならば:
ArrayList<String> places = Stream.of("Buenos Aires", "Córdoba", "La Plata").collect(Collectors.toCollection(ArrayList::new));
import com.google.common.collect.ImmutableList;
....
List<String> places = ImmutableList.of("Buenos Aires", "Córdoba", "La Plata");
JDK拡張提案 - 269 で示唆されているようにJava 9
を使用すると、これはコレクションリテラルを使用して達成できます -
List<String> list = List.of("A", "B", "C");
Set<String> set = Set.of("A", "B", "C");
同様のアプローチがMap
にも当てはまります -
Map<String, String> map = Map.of("k1", "v1", "k2", "v2", "k3", "v3")
これは コレクションリテラルの提案 にも似ています@coobirdも述べています。さらにJEPのドキュメントでも明らかに -
代替案
言語の変更は何度か検討されてきましたが、拒否されました。
JEP 186 lambda-devに関する議論、2014年1月 - 3月
言語提案は、この message。 に要約されているように、ライブラリーベースの提案よりも優先されます。
Related => Java 9のコレクションに対するコンビニエンスファクトリメソッドのオーバーロードのポイントは何ですか?
ファクトリメソッドを作成できます。
public static ArrayList<String> createArrayList(String ... elements) {
ArrayList<String> list = new ArrayList<String>();
for (String element : elements) {
list.add(element);
}
return list;
}
....
ArrayList<String> places = createArrayList(
"São Paulo", "Rio de Janeiro", "Brasília");
しかし、それはあなたの最初のリファクタリングよりもはるかに優れていません。
柔軟性を高めるために、一般的なものにすることができます。
public static <T> ArrayList<T> createArrayList(T ... elements) {
ArrayList<T> list = new ArrayList<T>();
for (T element : elements) {
list.add(element);
}
return list;
}
Java 9では、1行で簡単にArrayList
を初期化できます。
List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");
または
List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));
この新しいJava 9のアプローチには、以前のものに比べて多くの利点があります。
詳細については、この記事を参照してください - >List.ofとArrays.asListの違いは何ですか?
Eclipse Collections を使えば、次のように書くことができます。
List<String> list = Lists.mutable.with("Buenos Aires", "Córdoba", "La Plata");
また、タイプについて、そしてそれらがミュータブルかイミュータブルかについて、より具体的になることもできます。
MutableList<String> mList = Lists.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableList<String> iList = Lists.immutable.with("Buenos Aires", "Córdoba", "La Plata");
セットとバッグでも同じことができます。
Set<String> set = Sets.mutable.with("Buenos Aires", "Córdoba", "La Plata");
MutableSet<String> mSet = Sets.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet<String> iSet = Sets.immutable.with("Buenos Aires", "Córdoba", "La Plata");
Bag<String> bag = Bags.mutable.with("Buenos Aires", "Córdoba", "La Plata");
MutableBag<String> mBag = Bags.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableBag<String> iBag = Bags.immutable.with("Buenos Aires", "Córdoba", "La Plata");
注: 私はEclipseコレクションのコミッターです。
これは別の方法です:
List<String> values = Stream.of("One", "Two").collect(Collectors.toList());
これを行うための最もコンパクトな方法については、次のとおりです。
Double array[] = { 1.0, 2.0, 3.0};
List<Double> list = Arrays.asList(array);
以下のコードを使用してください。
List<String> list = new ArrayList<String>() {{
add("A");
add("B");
add("C");
}};
(コメントする必要がありますが、長すぎるので、新しい返信)。他の人が言ったように、Arrays.asList
メソッドは固定サイズですが、それが唯一の問題ではありません。継承もあまりうまく処理できません。たとえば、次のものがあるとします。
class A{}
class B extends A{}
public List<A> getAList(){
return Arrays.asList(new B());
}
List<B>
(これはArrays.asListによって返されるものです)はList<A>
オブジェクトにB型のオブジェクトを追加することができても、List<A>
のサブクラスではないため、上記の結果はコンパイラエラーになります。これを回避するには、次のようにする必要があります。
new ArrayList<A>(Arrays.<A>asList(b1, b2, b3))
これはおそらくこれを実行するための最良の方法です、特に。無制限のリストが必要な場合、または継承を使用する必要がある場合.
以下のステートメントを使用することができます。
String [] arr = {"Sharlock", "Homes", "Watson"};
List<String> names = Arrays.asList(arr);
Java 9には、 immutable のリストを作成するための次のメソッドがあります。
List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");
必要ならば、可変リストを作成するように簡単に適応されます。
List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));
Set
とMap
にも同様の方法があります。
好き トムは言った :
List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");
しかし、あなたがArrayListが欲しいと不満を言ったので、あなたは最初にArrayListがListのサブクラスであることを知っているべきです、そしてあなたは単にこの行を追加することができます:
ArrayList<String> myPlaces = new ArrayList(places);
しかし、それはあなたが「パフォーマンス」の不満を言うかもしれません。
その場合、私には意味がありません。なぜなら、あなたのリストは事前定義されているので、それは配列として定義されていなかったからです(初期化時にサイズがわかっているので)。そしてそれがあなたのための選択肢ならば:
String[] places = {"Buenos Aires", "Córdoba", "La Plata"};
パフォーマンスのわずかな違いを気にしないのであれば、非常に簡単に配列をArrayListにコピーすることもできます。
ArrayList<String> myPlaces = new ArrayList(Arrays.asList(places));
さて、しかし将来的には地名だけでなく国コードも必要になります。これはまだ実行時に変更されない定義済みのリストであると仮定すると、enum
セットを使用するのに適しています。将来リストを変更する必要がある場合は再コンパイルが必要になります。
enum Places {BUENOS_AIRES, CORDOBA, LA_PLATA}
になるだろう:
enum Places {
BUENOS_AIRES("Buenos Aires",123),
CORDOBA("Córdoba",456),
LA_PLATA("La Plata",789);
String name;
int code;
Places(String name, int code) {
this.name=name;
this.code=code;
}
}
Enumは、enumのすべての値を含む配列を宣言された順序で返す静的なvalues
メソッドを持っています。
for (Places p:Places.values()) {
System.out.printf("The place %s has code %d%n",
p.name, p.code);
}
その場合、私はあなたがあなたのArrayListを必要としないだろうと思います。
P.S Randyaaがデモンストレーションしました もう1つの静的なユーティリティメソッドを使ったいい方法 Collections.addAll 。
List<String> names = Arrays.asList("2","@2234","21","11");
Cactoos からStickyList
を使用できます。
List<String> names = new StickyList<>(
"Scott Fitzgerald", "Fyodor Dostoyevsky"
);
このコード行で試してください:
Collections.singletonList(provider)
はい、配列の助けを借りてあなたは一行で配列リストを初期化することができます、
List<String> strlist= Arrays.asList("aaa", "bbb", "ccc");
Javaでは、できません
ArrayList<String> places = new ArrayList<String>( Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
指摘したように、あなたは二重括弧の初期化をする必要があるでしょう:
List<String> places = new ArrayList<String>() {{ add("x"); add("y"); }};
しかし、これはアノテーション@SuppressWarnings("serial")
を追加することを強いるかもしれませんし、迷惑なシリアルUUIDを生成します。また、ほとんどのコードフォーマッタはそれを複数のステートメント/行に展開します。
代わりにあなたがすることができます
List<String> places = Arrays.asList(new String[] {"x", "y" });
しかしそれから@SuppressWarnings("unchecked")
をしたいと思うかもしれません。
またjavadocによると、あなたはこれを行うことができるはずです:
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
しかし、JDK 1.6でコンパイルすることはできません。
それを行うための最善の方法:
package main_package;
import Java.util.ArrayList;
public class Stackkkk {
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<Object>();
add(list, "1", "2", "3", "4", "5", "6");
System.out.println("I added " + list.size() + " element in one line");
}
public static void add(ArrayList<Object> list,Object...objects){
for(Object object:objects)
list.add(object);
}
}
必要なだけ要素を持つことができる関数を作成し、それを呼び出してそれらを1行に追加するだけです。
Collections.singletonList(messageBody)
あなたが 一つのアイテムのリストを持っている必要があるなら !
コレクション は Java.util パッケージからのものです。
これは AbacusUtil によるコードです。
// ArrayList
List<String> list = N.asList("Buenos Aires", "Córdoba", "La Plata");
// HashSet
Set<String> set = N.asSet("Buenos Aires", "Córdoba", "La Plata");
// HashMap
Map<String, Integer> map = N.asMap("Buenos Aires", 1, "Córdoba", 2, "La Plata", 3);
// Or for Immutable List/Set/Map
ImmutableList.of("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet.of("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet.of("Buenos Aires", 1, "Córdoba", 2, "La Plata", 3);
// The most efficient way, which is similar with Arrays.asList(...) in JDK.
// but returns a flexible-size list backed by the specified array.
List<String> set = Array.asList("Buenos Aires", "Córdoba", "La Plata");
宣言:私はAbacusUtilの開発者です。
これをする簡単な効用関数を作ってみませんか?
static <A> ArrayList<A> ll(A... a) {
ArrayList l = new ArrayList(a.length);
for (A x : a) l.add(x);
return l;
}
"ll
"は "literal list"を表します。
ArrayList<String> places = ll("Buenos Aires", "Córdoba", "La Plata");
私にとっては、Arrays.asList()が最も便利で便利です。私はいつもそのように初期化するのが好きです。もしあなたがJavaコレクションの初心者であれば、私はあなたに参照をお願いします ArrayListの初期化