É importante usar o Characteristics.UNORDERED nos coletores, quando possível?
Como eu uso bastante os fluxos, alguns deles lidando com uma grande quantidade de dados, pensei que seria uma boa idéia pré-alocar meus coletores baseados em coleções com um tamanho aproximado para evitar uma realocação dispendiosa à medida que a coleção cresce. Então, eu vim com isso, e similares para outros tipos de coleção:
public static <T> Collector<T, ?, Set<T>> toSetSized(int initialCapacity) {
return Collectors.toCollection(()-> new HashSet<>(initialCapacity));
}
Usado assim
Set<Foo> fooSet = myFooStream.collect(toSetSized(100000));
Minha preocupação é que a implementação deCollectors.toSet()
define umCharacteristics
enum queCollectors.toCollection()
não:Characteristics.UNORDERED
. Não há variação conveniente deCollectors.toCollection()
para definir as características desejadas além do padrão e não consigo copiar a implementação deCollectors.toSet()
devido a problemas de visibilidade. Então, para definir oUNORDERED
característica eu sou forçado a fazer algo assim:
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});
}
Então, aqui estão minhas perguntas: 1. Essa é minha única opção para criar um coletor não ordenado para algo tão simples quanto um costumetoSet()
2. Se eu quiser que isso funcione idealmente, é necessário aplicar a característica não ordenada? Eu liuma pergunta neste fórum onde aprendi que a característica não ordenada não é mais propagada novamente para o fluxo. Ainda serve a um propósito?