Usando opcional para preencher valor em um mapa

user3797829:

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"

David Lorenzo MARINO:

Neste código em particular o uso de Optionalnão é útil porque você não gosta de adicionar um Optionalpara o mapa, mas apenas ignorar nullvalores.

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 Consumercriado como expressão lambda dentro do ifPresentmétodo

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=196213&siteId=1
Recomendado
Clasificación