web-dev-qa-db-ja.com

Collectors.toSet()およびHashSet

サンプルコードの次の行を使用します。

_Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet());
_

HashSetが必要です。デバッガーをコードに使用すると、実際にHashSetが取得されます。 Java.util.stream.Collectors.toSet()を見て、次のコードを観察しました。

_public static <T> Collector<T, ?, Set<T>> toSet() {
    return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
                               (left, right) -> { left.addAll(right); return left; },
                               CH_UNORDERED_ID);
}
_

契約保証 a Set、および実装はHashSet;を決定します。理にかなっているようです。ただし、私の実装では、古いHashSetだけでなく、Setによって保証される一定時間のルックアップが必要です。 toSet()の実装がFooSetを使用することに決めた場合、これは完全にその権利の範囲内であり、私の実装は危険にさらされます。

この問題に対するベストプラクティスのソリューションは何ですか?

60
Robert Bain

保証されたHashSetが必要な場合は、 Collectors.toCollection(HashSet::new) を使用します。

98
Tagir Valeev