理解 @FunctionalInterface
- 用于函数式接口类型声明的信息注解类型。
- 函数式接口只能有一个抽象方法,并排除接口默认方法以及声明中覆盖Object的公开方法的统计。
- @FunctionalInterface不能标注在注解、类、枚举类上。
- 只要满足以上函数式接口的要求,无论接口声明中是否标注了@FunctionalInterface注解,均可以被编译器视作函数式接口。
函数式接口类型
提供类型 - Supplier<T>
@FunctionalInterface public interface Supplier<T> { /** * 获取一个数据,入参为空,返回一个值 * 相当于一个无入参且返回值为T的函数 */ T get(); }
消费类型 - Consumer<T>
@FunctionalInterface public interface Consumer<T> { /** * 接收一个值,做某些操作。参数传递进来后,要做什么。 * 相当于一个入参为T且无返回值的函数 */ void accept(T t); /** * 相当于Builder模式。Fluent API * 当传入一个值后,做完第一个操作,接下来要做什么 */ default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } }
转换类型 - Function<T,R>
@FunctionalInterface public interface Function<T, R> { /** * 转换操作,接收两个类型, * 将 T 类型的数据 转换为 R 类型的数据。 * 相当于一个入参为T,返回值为R的函数 */ 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)); } /** * 一个永远返回 入参 的函数 * 返回一个函数,它总是返回输入参数。调用该方法可以得到一个返回输入参数的Funtion * 这个Function就可以单纯的用来做数据处理,而不用类型转换 */ static <T> Function<T, T> identity() { return t -> t; } }
举个栗子:
Function<String, Long> stringToLong = Long::parseLong; Function<Long, String> longToString = String::valueOf; Function<Integer,String> intToString = String::valueOf;
stringToLong.apply 的意思是,接收一个string 返回一个Long
stringToLong.compose 的意思是,接收一个 Function<V,String>的函数式接口,这个函数式接口,接收一个V类型的参数,返回值是String类型,然后,再次同过stringToLong将返回值String 转换为 Long。这个操作是在执行完V To String 的操作后,再执行 stringToLong 的操作。
操作流程 V -> String > Long
stringToLong.andThen的意思是,接受一个Function<Long,V>的函数式接口,这个函数式接口,接收一个Long类型的参数,返回一个 V类型参数。这个操作是 在执行完stringToLong后,接下来执行Long To V的操作。
操作流程 String -> Long -> V
断定类型 - Predicate<T>
@FunctionalInterface public interface Predicate<T> { /** * 接收一个参数,返回值表示,当前参数是否符合预期要求 * 相当于一个入参为T,返回值为boolean的函数 */ boolean test(T t); /** * and 条件,相当于 条件A && 条件B */ 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); } /** * or 条件 相当于 条件A||条件B */ 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); } }
隐藏类型 - Action
- 类似于Runnable接口,无返回值,无入参。