FunctionalInterface解析

本文介绍了Java8中新增的@FunctionalInterface注解,强调了其作为函数式接口的特性,包括只能有一个抽象方法的要求,并详细列举了Function、Consumer、Predicate和Supplier等常见类型及其用法和源码示例。
摘要由CSDN通过智能技术生成

FunctionalInterface注解

FunctionalInterface`是Java8新增的一个注解,使用`FunctionalInterface`注解的接口被称为`函数式接口
@FunctionalInterface`注解的作用是告知编译器进行检查,可加可不加,但是如果加上了,那么接口必须为`函数式接口

特点

FunctionalInterface的Doc注释可知,函数式接口具有以下特点

upload successful

只能有一个抽象方法,但以下情况不计入

1、Java8自带的default方法

2、一个抽象方法重写了Object的一个公共方法

3、静态方法

比如下面这种情况

upload successful

函数式接口类型

一般在java.util.function包下我们可以看到所有的自带的符合函数式接口的类型,主要有以下几种类型

upload successful

Function

接收一个T类型的参数,返回一个R类型的结果

用法:

map.computeIfAbsent("name", String::length);

Function接口的andThen方法和compose方法

源码:

// 先执行before参数,再执行调用者(参数和调用者都是Function)
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
    Objects.requireNonNull(before);
    return (V v) -> apply(before.apply(v));
}
// 先执行调用者,再执行before参数((参数和调用者都是Function))
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
      Objects.requireNonNull(after);
      return (T t) -> after.apply(apply(t));
}

Consumer

接收一个T类型的参数,无返回结果

用法:

list.forEach(System.out::println);

源码:

// 消费参数t,消费规则自己定义
void accept(T t);

// 先执行调用者消费规则,再执行after参数的消费规则
default Consumer<T> andThen(Consumer<? super T> after) {
    Objects.requireNonNull(after);
    return (T t) -> { accept(t); after.accept(t); };
}

Predicate

接收一个T类型的参数,返回一个boolean类型的结果

用法:

list.removeIf(a -> a == 3);

源码:

// 对给定参数执行断定规则,断定规则自己定义,断定结果为boolean
boolean test(T t);

// 先对给定参数执行当前断定规则,再执行other断定规则,两个断定规则都需要符合(可理解为条件A && 条件B),返回为Predicate
default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) && other.test(t);
}

// 对test的断定规则取非,返回为Predicate
default Predicate<T> negate() {
      return (t) -> !test(t);
}

// 先对给定参数执行当前断定规则,再执行other断定规则,两个断定规则符合一个即可(可理解为条件A || 条件B),返回为Predicate
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);
}

Supplier

不接收参数,返回一个T类型的结果

用法:

Supplier<Random> randomSupplier = Random::new;

源码:

// 获取结果
T get();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值