E se eu não quiser Collectors#toMap
lançar valores nulos? Java 8
public class CollectorsTest {
@Test
public void collectorsTest() {
List<Map.Entry<String, Object>> params = Arrays.asList(
new AbstractMap.SimpleEntry<>("key1", 1),
new AbstractMap.SimpleEntry<>("key2", null)
);
Map<String, Object> paramMap = toParamMap(params); // throws NPE
}
private static Map<String, Object> toParamMap(List<Map.Entry<String, Object>> params) {
Map<String, Object> paramMap = params.stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
return paramMap;
}
}
Os
toMap
coletores não permitem entrada ou valores nulos. Para evitar isso, você pode usarforEach
withHashMap.put
como na resposta de Hiro Silva.Também é fácil continuar usando fluxos, o que pode ser preferível se estiver fazendo uso de paralelo ou filtros nos dados. Um coletor baseado em
HashMap
permitirá o uso de chaves e valores nulos.Stream.collect
lida com a definição de coletores personalizados, configurando com argumentos para fornecer um novoHashMap
e adicionar entradas a esse hashmap:É trabalhoso escrever o acima toda vez que você precisar, mas pode ser retrabalhado para um novo método retornando seu próprio coletor de hashmap com tipos genéricos de chave + valor. Isso funciona para manipular qualquer coleção de Map.Entry usando
Collector.of
:Então você pode coletar fluxos que
Map.Entry
contenham chave+valores nulos adicionando.collect(toHashMap())
, por exemplo:O antigo HashMap.put()
Os métodos modernos da biblioteca padrão, incluindo os métodos no pacote stream, não gostam de nulos como chaves ou valores em mapas. Geralmente por boas razões: nulos são problemáticos. Você pode considerar um design diferente onde chaves com valores nulos são omitidas do seu mapa.
paramMap.get(yourKey)
ainda retornará onull
que você diz que quer.Ainda pode haver situações em que você tem razões legítimas para querer um ou mais valores nulos no mapa. Para obter isso, você pode usar os métodos clássicos da introdução do framework de coleções Java no Java 1.2. Fica um pouco mais prolixo:
Testando com seu exemplo:
A saída é um mapa com um valor nulo: