Java 8 | Stream 常用函数接口

2017-08-02 From 程序之心 By 丁仪

前文介绍了 Java 8 新增的 Stream 及其使用方式。本文汇总一下 Stream 各个方法经常用到的函数接口。

Comparator 接口

Comparator 接口定义的抽象方法是 compare 方法,这个方法要求返回两个对象的大小关系。在 Java 8 之前,Comparator 接口仅仅定义了这一个抽象接口,而在 Java 8 中新增了很多静态方法和默认方法。该接口主要用于 max、min 方法。

Java 8 新增的默认方法主要是 reversed 和 thenComparing 方法。reversed 方法用于返回一个相反的 Comparator,比如从大于变为小于。thenComparing 方法用于在比较之后,在进行另一个比较操作。

Java 8 新增的静态方法主要是 comparing 方法,用于根据 lambda 表达式生成一些 Comparator 接口实现。如果把函数接口看成是函数,那么这里就是根据一个传入的函数返回另一个函数,是函数式编程里的高阶函数。

Predicate 接口

Predicate 接口是 Java 8 新增的接口,定义了一个抽象方法 test 来测试一个参数是否符合要求。这个接口主要用于 Stream 的 filter 方法,返回结果为 true 的参数符合过滤要求,返回结果为 false 的参数不符合过滤要求,符合过滤要求的参数放入返回的 Stream 中。

该接口也定义了默认方法和静态方法,and、or 方法返回两个 Predicate 接口测试结果的与、或结果,negate 方法返回测试结果的非结果,isEqual 方法判断两个接口是否相同。

boolean test(T t);
default Predicate < T > and(Predicate super T > other) {
    Objects.requireNonNull(other);
    return (t) - > test(t) && other.test(t);
}
default Predicate < T > negate() {
    return (t) - > !test(t);
}
default Predicate < T > or(Predicate super T > other) {
    Objects.requireNonNull(other);
    return (t) - > test(t) || other.test(t);
}
static < T > Predicate < T > isEqual(Object targetRef) {
    return (null == targetRef) ? Objects::isNull : object - > targetRef.equals(object);
}

Function 接口

Function 接口是 Java 8 新增的接口,定义了一个抽象方法 apply,这个方法用于执行一个操作并返回操作结果,主要用于 Stream 中的 map、flatMap 等方法。apply 方法只接受一个参数,参数和返回值都可以是任意类型。

Function 接口提供了 compose 方法用于在执行自身 apply 方法前先执行另一个 Function 接口,andThen 方法用于在执行自身 apply 方法后再执行另一个 Function 接口,以及 identity 方法用于获得一个返回值与参数相同的 Function 接口。

R apply(T t);
default < V > Function < V, R > compose(Function super V, ? extends T > before) {
    Objects.requireNonNull(before);
    return (V v) - > apply(before.apply(v));
}
default < V > Function < T, V > andThen(Function super R, ? extends V > after) {
    Objects.requireNonNull(after);
    return (T t) - > after.apply(apply(t));
}
static < T > Function < T, T > identity() {
    return t - > t;
}

BiFunction 和 BinaryOperator 接口

BinaryOperator 接口是 Java 8 新增的接口,继承了 BiFunction 接口。BiFunction 接口定义了一个抽象方法 apply,用于执行一个操作并返回操作结果,主要用于 Stream 中的 reduce 方法。与 Function 接口相比,这里的 apply 接收两个参数。

BiFunction 接口定义了默认方法 andThen 用于在当前 apply 执行之后执行另一个 Function 接口;BinaryOperator 接口定义了两个静态方法,minBy 方法用于返回两个参数中较小的一个,maxBy 方法用于返回两个参数中较大的一个。

public interface BiFunction < T, U, R > {
    R apply(T t, U u);
    default < V > BiFunction < T,
    U,
    V > andThen(Function super R, ? extends V > after) {
        Objects.requireNonNull(after);
        return (T t, U u) - > after.apply(apply(t, u));
    }
}
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;
    }
}

本文来源:程序之心,转载请注明出处!

君子曰:学不可以已。
《知识图谱:概念与技术》

知识图谱是一种大规模语义网络,已经成为大数据时代知识工程的代表性进展。知识图谱技术是实现机器认知智能和推动各行业智能化发展的关键基础技术。知识图谱也成为大规模知识工程的代表性实践,其学科日益完善。本书是一本系统介绍知识图谱概念、技术与实践的书籍。

发表感想

© 2016 - 2024 chengxuzhixin.com All Rights Reserved.

浙ICP备2021034854号-1    浙公网安备 33011002016107号