web-dev-qa-db-ja.com

Set <String>をList <String>に変換する最も簡潔な方法

私は現在これをやっています:

Set<String> setOfTopicAuthors = ....

List<String> list = Arrays.asList( 
    setOfTopicAuthors.toArray( new String[0] ) );

これに勝てる?

196
List<String> list = new ArrayList<String>(listOfTopicAuthors);
422
Schildmeijer
List<String> l = new ArrayList<String>(listOfTopicAuthors);
88
Adamski

Set<String> stringSetがあることを考慮すると、以下を使用できます。

Java 10(変更不可能なリスト)

List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());

Java 8(変更可能なリスト)

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));

Java 8(変更不可能なリスト)

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::unmodifiableListdoc に従って、指定されたリストの変更不可能なビューを返すことです。変更不可能なビューコレクションは、変更不可能なコレクションであり、バッキングコレクションのビューでもあります。バッキングコレクションへの変更は依然として可能性があることに注意してください。変更が発生した場合は、変更不可能なビューで表示できます。ただし、コレクターメソッドCollectors.unmodifiableListは、Java 10で真に不変のリストを返します。

22
i_am_zero

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());
13

Guavaを使用している場合、newArrayListメソッドを Lists クラスから静的にインポートします。

List<String> l = newArrayList(setOfAuthors);
2
Andrejs

コードのコンテキストを介して正確に何をしているのか本当にわかりませんが...

なぜlistOfTopicAuthors変数を作成するのですか?

List<String> list = Arrays.asList((....).toArray( new String[0] ) );

「....」は、セットが新しいか別の場所から来たかに関わらず、セットが登場したことを表します。

0
jp093121