Я стараюсь познакомиться с лямбда-функциями. Для начала я решил написать удобный класс под названием TernaryOperator
. Итак, вопрос в том, правильно ли я получил идеологию, или я что-то упускаю, так как это должно быть сделано по-другому?Является ли это правильным использованием функционального интерфейса?
public class TernaryOperator<T, U> implements Function<T, U> {
private final Function<T, U> f;
public TernaryOperator(Predicate<? super T> condition,
Function<? super T, ? extends U> ifTrue,
Function<? super T, ? extends U> ifFalse) {
this.f = t -> condition.test(t) ? ifTrue.apply(t) : ifFalse.apply(t);
}
@Override
public U apply(T t) {
return f.apply(t);
}
}
Я вижу использование этого класса, как это:
Predicate<Object> condition = Objects::isNull;
Function<Object, Integer> ifTrue = obj -> 0;
Function<CharSequence, Integer> ifFalse = CharSequence::length;
Function<String, Integer> safeStringLength = new TernaryOperator<>(condition, ifTrue, ifFalse);
И теперь я могу вычислить длину любой строки, даже если он пустой с этим Oneliner.
Итак, если у вас есть идеи, как лучше писать TernaryOperator
, или если вы считаете, что это бесполезно, сообщите мне.
Ваш код в порядке. – Jesper
Это лучше подходит для http://codereview.stackexchange.com/ –