игнорирование значений null или Optional.empty при отображении - PullRequest
1 голос
/ 12 марта 2019

Есть ли на карте это, вместо того, чтобы проходить через это? В некоторых случаях это значение не следует указывать на карте, поэтому я хочу игнорировать их:

Map<A, String> returnMap = new HashMap<>();
Map<A, List<Long>> mapLByA = //...
mapLByA.forEach((k, v) -> {
    Optional<String> strOp = someMethod(v);
    if (str.isPresent()) {
        returnMap.put(k, strOp.get());
    }
});
return returnMap;

Ответы [ 3 ]

4 голосов
/ 13 марта 2019

Вы можете сопоставить значения списка с необязательными строковыми значениями, затем отфильтровать пустые необязательные значения и, наконец, собрать их на карту. Вам не нужно явно определять returnMap.

return mapLByA.entrySet().stream()
        .map(e -> Map.entry(e.getKey(), someMethod(e.getValue())))
        .filter(e -> e.getValue().isPresent())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Edit:

Map.entry была введена в Java 9. Для Java 8 используйте вместо этого оператор map:

.map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), someMethod(e.getValue())))
2 голосов
/ 13 марта 2019

Вам все еще нужно выполнить цикл, как внешний, так и внутренний, никак не обойти его. Но вы могли бы упростить этот код до одной строки, но не можете сказать, делает ли он его более читабельным:

mapLByA.forEach((k, v) -> someMethod(v).ifPresent(s -> returnedMap.put(k, s)));
1 голос
/ 13 марта 2019

Вы можете просто использовать ifPresent в контексте как:

mapLByA.forEach((k, v) -> 
        someMethod(v).ifPresent(optional -> 
                returnMap.put(k, optional)));
...