Eu sou novo para Java, e ainda está aprendendo Opcionais. Eu entendi a sua utilizado para evitar a exceção de ponteiro nulo.
Eu tenho um pedaço de código que eu quero uso opcional, que é parecido com isto:
final MetadataExtractor<FCAddress> metadataExtractor = t -> {
final Map<String, String> metadata = new HashMap<>();
metadata.put("senderCountryCode", t.getCountryCode());
metadata.put("senderState", t.getState());
metadata.put("senderPostalCode",t.getPostalCode());
return metadata;
};
Aqui, o meu caso de uso é, se o SenderState está vazia, ietgetState () está vazio, eu quero o campo de mapa para estar vazio, que não está preenchido.
Eu tentei algo parecido com isto:
final MetadataExtractor<FCAddress> metadataExtractor = t -> {
final Map<String, String> metadata = new HashMap<>();
metadata.put("senderCountryCode", t.getCountryCode());
Optional<String> senderState = Optional.of(t.getState());
senderState.ifPresent(metadata.put("senderState", t.getState());
metadata.put("senderPostalCode",t.getPostalCode());
return metadata;
};
Mas isso dá um erro de compilação, onde estou indo errado nisto? O erro é: "ifPresent (java.util.function.Consumer) em opcional não pode ser aplicado"
Neste código em particular o uso de Optional
não é útil porque você não gosta de adicionar um Optional
para o mapa, mas apenas ignorar null
valores.
A solução mais simples que não cria novos objetos é a adição de um cheque no valor de t.getState()
como segue:
final MetadataExtractor<FCAddress> metadataExtractor = t -> {
final Map<String, String> metadata = new HashMap<>();
metadata.put("senderCountryCode", t.getCountryCode());
if (t.getState() != null) {
metadata.put("senderState", t.getState());
}
metadata.put("senderPostalCode",t.getPostalCode());
return metadata;
};
Apenas para estudar objetivo a solução de GhostCat trabalha com um Optional
:
senderState.ifPresent(() -> metadata.put("senderState", t.getState());
o exemplo completo será:
final MetadataExtractor<FCAddress> metadataExtractor = t -> {
final Map<String, String> metadata = new HashMap<>();
metadata.put("senderCountryCode", t.getCountryCode());
// Here you create a not useful object that can be replaced with a simple if
Optional<String> senderState = Optional.ofNullable(t.getState());
// Here you create a second not necessary object because a lambda
// espression is an instance of an anonimous class implementing
// the corresponding interface
senderState.ifPresent(() ->
metadata.put("senderState", t.getState()
);
metadata.put("senderPostalCode",t.getPostalCode());
return metadata;
};
Note-se que esta solução irá criar dois objetos desnecessários:
- a explícita
Optional
senderState
- e um outro objecto para o
Consumer
criado como expressão lambda dentro doifPresent
método