私は現在これをやっています:
Set<String> setOfTopicAuthors = ....
List<String> list = Arrays.asList(
setOfTopicAuthors.toArray( new String[0] ) );
これに勝てる?
List<String> list = new ArrayList<String>(listOfTopicAuthors);
List<String> l = new ArrayList<String>(listOfTopicAuthors);
Set<String> stringSet
があることを考慮すると、以下を使用できます。
List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());
import static Java.util.stream.Collectors.*;
List<String> stringList1 = stringSet.stream().collect(toList());
メソッドtoList()
の doc に従って
返されるリストの型、可変性、直列化可能性、またはスレッドセーフ性についての保証はありません。返されたリストをさらに制御する必要がある場合は、toCollection(Supplier)を使用します。
したがって、特定の実装が必要な場合、たとえばArrayList
この方法で取得できます。
List<String> stringList2 = stringSet.stream().
collect(toCollection(ArrayList::new));
Collections::unmodifiableList
メソッドを使用して、前の例で返されたリストをラップできます。また、独自のカスタムメソッドを次のように記述することもできます。
class ImmutableCollector {
public static <T> Collector<T, List<T>, List<T>> toImmutableList(Supplier<List<T>> supplier) {
return Collector.of( supplier, List::add, (left, right) -> {
left.addAll(right);
return left;
}, Collections::unmodifiableList);
}
}
そして、それを次のように使用します:
List<String> stringList3 = stringSet.stream()
.collect(ImmutableCollector.toImmutableList(ArrayList::new));
別の可能性は、collectingAndThen
メソッドを使用して、結果を返す前に最終的な変換を行うことです。
List<String> stringList4 = stringSet.stream().collect(collectingAndThen(
toCollection(ArrayList::new),Collections::unmodifiableList));
注意すべき1つのポイントは、メソッドCollections::unmodifiableList
が doc に従って、指定されたリストの変更不可能なビューを返すことです。変更不可能なビューコレクションは、変更不可能なコレクションであり、バッキングコレクションのビューでもあります。バッキングコレクションへの変更は依然として可能性があることに注意してください。変更が発生した場合は、変更不可能なビューで表示できます。ただし、コレクターメソッドCollectors.unmodifiableList
は、Java 10で真に不変のリストを返します。
Set でこれを試してください:
Set<String> listOfTopicAuthors = .....
List<String> setList = new ArrayList<String>(listOfTopicAuthors);
Map でこれを試してください:
Map<String, String> listOfTopicAuthors = .....
// List of values:
List<String> mapValueList = new ArrayList<String>(listOfTopicAuthors.values());
// List of keys:
List<String> mapKeyList = new ArrayList<String>(listOfTopicAuthors.KeySet());
Guavaを使用している場合、newArrayList
メソッドを Lists クラスから静的にインポートします。
List<String> l = newArrayList(setOfAuthors);
コードのコンテキストを介して正確に何をしているのか本当にわかりませんが...
なぜlistOfTopicAuthors
変数を作成するのですか?
List<String> list = Arrays.asList((....).toArray( new String[0] ) );
「....」は、セットが新しいか別の場所から来たかに関わらず、セットが登場したことを表します。