Важно ли использовать Characteristics.UNORDERED в коллекционерах, когда это возможно?
Поскольку я часто использую потоки, некоторые из которых имеют дело с большим объемом данных, я подумал, что было бы неплохо предварительно выделить коллекторы, основанные на коллекции, приблизительным размером, чтобы предотвратить дорогостоящее перераспределение по мере роста коллекции. Итак, я придумал это и похожие для других типов коллекций:
public static <T> Collector<T, ?, Set<T>> toSetSized(int initialCapacity) {
return Collectors.toCollection(()-> new HashSet<>(initialCapacity));
}
Используется как это
Set<Foo> fooSet = myFooStream.collect(toSetSized(100000));
Я обеспокоен тем, что реализацияCollectors.toSet()
устанавливаетCharacteristics
перечислите чтоCollectors.toCollection()
не:Characteristics.UNORDERED
, Там нет удобного вариантаCollectors.toCollection()
установить желаемые характеристики за пределы по умолчанию, и я не могу скопировать реализациюCollectors.toSet()
из-за проблем видимости. Итак, чтобы установитьUNORDERED
характеристика я вынужден сделать что-то вроде этого:
static<T> Collector<T,?,Set<T>> toSetSized(int initialCapacity){
return Collector.of(
() -> new HashSet<>(initialCapacity),
Set::add,
(c1, c2) -> {
c1.addAll(c2);
return c1;
},
new Collector.Characteristics[]{IDENTITY_FINISH, UNORDERED});
}
Итак, вот мои вопросы: 1. Это мой единственный вариант для создания неупорядоченного коллектора для чего-то простого, как обычайtoSet()
2. Если я хочу, чтобы это работало идеально, нужно ли применять неупорядоченную характеристику? я прочелвопрос на этом форуме где я узнал, что неупорядоченная характеристика больше не распространяется обратно в поток. Это все еще служит цели?