我正在尝试熟悉lambda函数。首先,我决定编写一个名为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
或者如果您认为它没用,请告诉我。
答案 0 :(得分:7)
无需实现Function
接口。最好在某个合适的类中编写静态方法:
public static <T, U> Function<T, U> ternary(Predicate<? super T> condition,
Function<? super T, ? extends U> ifTrue,
Function<? super T, ? extends U> ifFalse) {
return t -> condition.test(t) ? ifTrue.apply(t) : ifFalse.apply(t);
}
并像这样使用:
Function<String, Integer> safeStringLength = MyClass.ternary(condition, ifTrue, ifFalse);
还可以考虑将import static
用于您的实用工具类,并简单地编写ternary(condition, ifTrue, ifFalse)
。
这种方法可能在某些情况下很有用。特别是当你可以使用方法引用时。例如:
Stream.of(strings).map(ternary(String::isEmpty, x -> "none", String::trim))...