Java 8功能接口默认和静态方法返回类型与功能接口名称相同



在Java 8功能接口中,为什么默认方法和静态方法应将返回类型作为相同的功能接口名称。

@FunctionalInterface
public interface Comparator<T> {
    public int compare(T t1, T t2);
    public default Comparator<T> thenComparing(Comparator<T> cmp){
        return (p1,p2)->compare(p1,p2)==0?cmp.compare(p1, p2):compare(p1,p2);
    } // return an int
    public default Comparator<T> thenComparing(Function<T,Comparable> f){
        return thenComparing(comparing(f)); // return an int
    }
    public static <U>Comparator<U> comparing(Function<U,Comparable> f){
        return (p1,p2)->f.apply(p1).compareTo(f.apply(p2)); // return an int
    }
}

他们不必这样做。方法可以无效或返回任何方法。

Comparator的碰巧具有返回Comparator的静态和默认方法,但这只是休闲。

许多默认方法返回自我类型,因为这允许方法链接。

默认静态方法仅定义为返回类型所需的内容。

对于Comparator,返回Comparator是有意义的,因为这些方法是出厂方法。

查看其他具有默认静态方法的功能接口,您会看到不同的内容。
例如:Iterable.forEach()定义为default void forEach(Consumer<? super T> action)

功能接口中的静态/默认方法无法获得特殊处理。它们像普通接口中的任何其他默认方法一样工作。他们可以返回自己喜欢的任何东西。

您在功能接口中看到静态/默认方法经常返回相同的类型,因为将它们放在那里很有意义。

例如,您还在哪里放置comparing方法?在Consumer<T>Supplier<T>中?不,将其放入Comparator<T>才有意义。对于thenComparing方法,这是因为在比较对象上调用它们很有用,而且非常可读性:

Comparator.comparing(x -> x.something).thenComparing(x -> x.somethingElse)

如果您编写了自己的功能接口,并且会想到可以在其中完成的某些操作,从而将其转换为另一个功能界面,然后将其添加!编写返回另一种类型的默认方法!

最新更新