今天介紹的這兩位兄弟大U(Unary:一元的)和大B(Binary:二元的)其實並不是全新的東西,而是兩個特例,我們先來康康他們的源碼。
UnaryOperator的源碼:
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
static <T> UnaryOperator<T> identity() {
return t -> t;
}
}
BinaryOperator的源碼:
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T> {
public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;
}
public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
}
}
從源碼可以看出UnaryOperator繼承自Function<T, T>,而且Function的參數和返回值都是同類型T,因此Function的參數和返回值是同類型的時候,我們可以使用UnaryOperator來代替Function。同理,BinaryOperator也是如此,它繼承自BiFunction<T, T, T>,當返回值和兩個參數的類型都相同時,可以使用BinaryOperator來代替BiFunction。這個做也是爲了簡化開發,JDK只提供了一元和二元的實現。當然,如果你有需求,你也可以自己實現TernaryOperator(三元的)。
Function作爲JDK自帶的函數編程接口,擁有很有變體,其地位可見一斑,所以小夥伴們一定要多看多思考,JDK給我們是一顆顆大白菜,但是希望各位能在內心種下它們的種子,學會融會貫通,活學活用。
Operator還有一些變體,如下:
接口名 | 參數 | 返回類型 | 描述 |
---|---|---|---|
IntUnaryOperator | int | int | 參數、返回值都是int類型 |
DoubleUnaryOperator | double | double | 參數、返回值都是double類型 |
LongUnaryOperator | long | long | 參數、返回值都是long類型 |
IntBinaryOperator | (int, int) | int | 兩個參數、返回值都是int類型 |
DoubleBinaryOperator | (double, double) | double | 兩個參數、返回值都是double類型 |
LongBinaryOperator | (long, long) | long | 兩個參數、返回值都是long類型 |
好了,到此JDK所有重要的函數編程接口都介紹完了。
其他函數編程接口介紹: