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()
返されるListのタイプ、変更可能性、直列化可能性、またはスレッドセーフ性は保証されません。返されたリストをさらに制御する必要がある場合は、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つの点は、docのように、メソッドCollections::unmodifiableList
が指定されたリストの変更不可能なビューを返すことです。変更不可能なビューコレクションは、変更不可能なコレクションであり、バッキングコレクションのビューでもあります。バッキングコレクションへの変更は引き続き可能であることに注意してください。変更が発生した場合は、変更不可能なビューから表示できます。しかし、コレクターメソッドは、Java 10では真に不変のリストを返します。Collectors.unmodifiableList
java.util.Collection
:O(0)