удалить если для фильтрации потока


У меня следующий код, который проверяет на дубликаты собственность и предоставить и предупреждение когда ключ существует и дать ошибку, если ключ и значение имеют те же значения. Код сделали некоторые итерации и ее рабочих на мой вопрос есть ли способ, чтобы избежать, если это заявление ?

      Map<String, Object> existProp = requires.get(reqidx).getProperties();
        Optional<Map.Entry<String, Object>> foundProperty = properties.entrySet().stream().filter(property -> existProp.containsKey(property.getKey())).findFirst();
        if (foundProperty.isPresent()) {
            // Same key already exists 
            LOG.warn("Property with key {} already exists in requires {}", foundProperty.get().getKey(), requires.get(reqidx).getName());
            // in case the existing property has the same value (check only for value of type String)
            if (foundProperty.get().getValue() instanceof String
                    && existProp.get(foundProperty.get().getKey()) instanceof String
                    && (foundProperty.get().getValue()).equals(existProp.get(foundProperty.get().getKey()))) {
                throw new Exception("Property " + foundProperty.get().getKey() + "  exists already with value " + foundProperty.get().getValue() + " in requires " + requiresName);
            }
        }
        return reqidx;
    }


146
2
задан 30 января 2018 в 12:01 Источник Поделиться
Комментарии
2 ответа

Каждый Optional.isPresent() можно заменить свободно Optional.ifPresent() который принимает Consumer функция арг (что может быть лямбда-выражение), которое принимает значение Optional.get()

properties.entrySet().stream().filter(property -> existProp.containsKey(property.getKey()))
.findFirst().ifPresent(foundPropertyValue -> {
// Same key already exists
LOG.warn("Property with key {} already exists in requires {}", foundPropertyValue.getKey(), requires.get(reqidx).getName());
// in case the existing property has the same value (check only for value of type String)
if (foundPropertyValue.getValue() instanceof String
&& existProp.get(foundPropertyValue.getKey()) instanceof String
&& (foundPropertyValue.getValue()).equals(existProp.get(foundPropertyValue.getKey()))) {
throw new Exception("Property " + foundPropertyValue.getKey() + " exists already with value " + foundPropertyValue.getValue() + " in requires " + requiresName);
}
});

2
ответ дан 30 января 2018 в 01:01 Источник Поделиться

в принципе у вас есть одно условие фильтрации, нет причин, чтобы расколоть его.
из значения строки,
просто проверьте его в функцию в поток, как:

property -> {
Object val = existProp.get(property.getKey())
return val != null && val.getClass().equals(String.class) && val.equals(property.getValue();
}

Вам нужно искать другую опору, если же ключ был найден, но значение не является строкой?

1
ответ дан 30 января 2018 в 01:01 Источник Поделиться