java8四大函数式接口

四大核心函数式接口

名称一元接口二元接口方法说明
一般函数FunctionBiFunctionapply输入T,输出R
算子函数(继承Function)UnaryOperatorBinaryOperatorapply输入输出同类型
谓词函数PredicateBiPredicatetest输出boolean
消费者ConsumerBiConsumeraccept无返回值
生产者Supplier-get无参数,只有返回值

生产者Supplier

@FunctionalInterface
public interface Supplier<T> {
    T get();
}
案例

双冒号(::)运算符在Java 8中被用作方法引用(method reference),方法引用是与lambda表达式相关的一个重要特性。它提供了一种不执行方法的方法。为此,方法引用需要由兼容的函数接口组成的目标类型上下文。

Supplier<String> str = String::new;
String a = str.get();
String b = str.get();
// false
System.out.println("生产者Supplier获取到的new String是否相等: " + (a == b));
String s = "1234";
Supplier<Integer> length = s::length;
// 4
System.out.println("字符串长度: " + length.get());

消费者Consumer

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}
案例
Consumer<Integer> consumer1 = x -> System.out.println("消费者Consumer1: " + (x + 2));
Consumer<Integer> consumer2 = x -> System.out.println("消费者Consumer2: " + (x + 4));
consumer1.andThen(consumer2).accept(2);
// 消费者Consumer1: 4
// 消费者Consumer2: 6

谓词函数Predicate

@FunctionalInterface
public interface Predicate<T> {

    /**
     * 函数式接口断言,给一个参数T,返回boolean类型的结果。
     */
    boolean test(T t);

    /**
     * 接收一个Predicate类型,装传入的条件和当前条件以并且的关系过滤数据。
     */
    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方法接收一个Predicate类型,将传入的条件和当前的条件以或者的关系过滤数据。
     */
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    /**
     * 通过传入对象的equals方法进行判断。
     */
    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}
案例
Predicate<Integer> predicate = x -> x > 2;
Predicate<Integer> predicate1 = x -> x < 9;
Predicate<Integer> predicate2 = x -> x % 2 == 0;
// false
System.out.println("Predicate: " + predicate.test(2));
// 无限流   i -> i + 1是一个算子函数
Stream<Integer> iterate = Stream.iterate(1, i -> i + 1);
// 1357
iterate.limit(10)
        .filter(predicate
                .and(predicate1)
                .and(predicate2.negate())
                .or(Predicate.isEqual(1)))
        .forEach(System.out::print);

一般函数Function

@FunctionalInterface
public interface Function<T, R> {

    /**
     * 执行函数
     */
    R apply(T t);

    /**
     * a.compose(b) b先执行,a后执行
     */
    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

    /**
     * a.andThen(b) a先执行,b后执行
     */
    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;
    }
}
案例
Function<Integer, Integer> function1 = i -> i + i;
Function<Integer, Integer> function2 = i -> i * i;
// Function compose: 50
System.out.println("Function compose: " + function1.compose(function2).apply(5));
// Function andThen: 100
System.out.println("Function andThen: " + function1.andThen(function2).apply(5));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值