Вкратце - нет. Нет ничего плохого или сложного с этим кодом, который разрешимо с помощью lambdas per se. Что вам лучше делать, это посмотреть, что на самом деле делает этот код, и упростить его оттуда. Мой взгляд на него, если вы не можете изменить подпись isValuePresent
, то сделать что-то вроде этого:
boolean isValuePresent(String id, Optional<String> option) {
if (!option.isPresent()) { // this already saves us loading the config if we've got no value to check against
return false;
}
FeatureClass features = configStorage.getConfig().getConfigMap().get(id);
if (features == null) { // replaces containsKey().get() with one call. It is hardly an improvement, just my stylistic choice
return false;
}
String value = option.get();
if (features.getset().contains(value) { // we actually have no need to check if set is empty or not, we rather have it handle that itself
log.info(String.format("value present for id %s", id));
return true;
}
return false;
}
Или, если вы можете изменить подписи, я считаю, что лучше иметь что-то вроде этого:
boolean isValuePresent(String id, String value) {
FeatureClass features = configStorage.getConfig().getConfigMap().get(id);
if (features == null) {
return false;
}
if (features.getset().contains(value)) {
log.info(<snip>);
return true;
}
return false;
}
И называть это так:
String id = loadId();
Optional<String> myValue = loadMyValue(id);
return myValue.map(value -> Checker.isValuePresent(id, value)).orElse(false);
Как вы можете видеть, нет лямбды, потому что нет никакой необходимости в них - ни в какой точке мы здесь чтобы изменить наше поведение, в этом методе нет стратегии, которая могла бы быть подключена снаружи.
Теперь о том, почему я решил не иметь Дополнительно в аргументе:
- Это обеспечивает большую гибкость для абонентов вашего метода. Если у них уже есть значение
String
, они не будут обязаны обертывать его бесполезным Optional
перед вызовом вашего метода.
- Использование метода аргумента метода выглядит уродливым, потому что этот класс предназначен для использования в качестве возвращаемого значения и не предлагает много аргументов, кроме
isPresent()
и get()
. Сравните это с хорошим количеством методов извлечения контролируемых значений, когда оно используется как возвращаемое значение (чтобы назвать несколько, orElse
, orElseGet
, map
, flatMap
и еще больше, чтобы прийти в Java 9).
java.util.Optional
не Serializable
, что положит конец вызову вашего метода через удаленный интерфейс (это, конечно, подразумевает, что вы заботитесь о его вызове через удаленный интерфейс).
Для начала создайте новую функцию для блока, если oyu've обнаружил, что вы вложили более двух операторов if. – awiebe
Почему у вас есть опция «Необязательный» как метод ввода? Конечно, вы можете проверить, присутствует ли он заранее, и просто предположить, что «значение нет»? –