В этом есть несколько аспектов.
1) Нули
Лучше всего избегать проблемы проверки на нулевые значения, никогда не назначая нулевые. Это относится независимо от того, занимаетесь ли вы функциональным программированием или нет. К сожалению, большая часть кода библиотеки предоставляет возможность возвращать нулевое значение, но старайтесь ограничить воздействие, обрабатывая его в одном месте.
Независимо от того, выполняете ли вы FP или нет, вы обнаружите, что гораздо меньше разочаровываетесь, если вам никогда не придется писать нулевые проверки при вызове ваших собственных методов, потому что ваши собственные методы никогда не могут возвращать null.
Альтернативой переменным, которые могут быть нулевыми, является использование Optional
класса Java 8.
Вместо:
public String myMethod(int i) {
if(i>0) {
return "Hello";
} else {
return null;
}
}
Do:
public Optional<String> myMethod(int i) {
if(i>0) {
return Optional.of("Hello");
} else {
return Optional.empty();
}
Посмотрите на Optional
Javadoc, чтобы увидеть, как это заставляет звонящего думать о возможности ответа Optional.empty()
.
Поскольку мост между мирами «ноль означает отсутствие» и «Optional.empty()
означает отсутствие», вы можете использовать Optional.ofNullable(val)
, который возвращает Empty
, когда val == null
. Но имейте в виду, что Optional.empty()
и Optional.of(null)
- это разные значения.
2) Исключения
Это правда, что создание исключения в обработчике потока работает не очень хорошо. Исключения не очень дружественный к FP механизм. Подходящая для FP альтернатива - Either
- которая не является стандартной частью Java, но ее легко написать самостоятельно или найти в сторонних библиотеках: Есть ли эквивалент Scala's Either в Java 8?
public Either<Exception, Result> meaningfulMethod(Value val) {
try {
return Either.right(methodThatMightThrow(val));
} catch (Exception e) {
return Either.left(e);
}
}
... тогда:
List<Either<Exception, Result>> results = listOfValues.stream().map(meaningfulMethod).collect(Collectors.toList());
3) Индексы
Вы хотите знать индекс элемента потока, когда вы используете поток, сделанный из List
? См. Есть ли краткий способ перебора потока с индексами в Java 8?