ant*_*npp 7 java lambda java-8
我想熟悉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);
}
}
Run Code Online (Sandbox Code Playgroud)
我看到这个类的用法是这样的:
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);
Run Code Online (Sandbox Code Playgroud)
而且现在我可以计算任何字符串的长度,即使它与此oneliner为空.
所以,如果你有任何想法如何写得更好TernaryOperator
或如果你认为它没用,请告诉我.
无需实现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);
}
Run Code Online (Sandbox Code Playgroud)
并使用这样的:
Function<String, Integer> safeStringLength = MyClass.ternary(condition, ifTrue, ifFalse);
Run Code Online (Sandbox Code Playgroud)
还可以考虑使用import static
您的实用程序类并简单地编写ternary(condition, ifTrue, ifFalse)
.
可能这种方法在某些情况下可能有用.特别是当你可以使用方法引用时.例如:
Stream.of(strings).map(ternary(String::isEmpty, x -> "none", String::trim))...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
580 次 |
最近记录: |