这是Function接口的正确用法吗?

时间:2015-10-22 14:59:43

标签: 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);
    }
}

我看到这个类的用法如下:

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或者如果您认为它没用,请告诉我。

1 个答案:

答案 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))...