自定义函数式接口

函数式接口

序言

Jdk8已经发布8年,目前公司一直在使用Java8语法,所以花点时间写一篇关于函数式接口的文章,以便新手学习和老手回顾。

什么是函数式接口

函数是接口(Functional Interface)的定义非常容易理解:只有一个抽象方法的接口,就是函数式接口(可以有多个default修饰的普通方法)。可以通过Lambda表达式来创建函数式接口的对象。

基本函数式接口

Jdk8定义了四个基本函数式接口,分别是:Consumer、Predicate、Supplier、Function,以下是它们的代码

Consumer(消费):

// 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); };
    }
}

Predicate(预测):

// Predicate代码片段
@FunctionalInterface
public interface Predicate<T> {
	//抽象方法
    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);
    }
}

Supplier(提供):

// Supplier代码片段
@FunctionalInterface
public interface Supplier<T> {
	//抽象方法
    T get();
}

Function(函数):

// Function代码片段
@FunctionalInterface
public interface Function<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));
    }

    static <T> Function<T, T> identity() {
        return t -> t;
    }
}

扩展函数式接口

以上定义的4种函数式接口能解决我们开发的一部分需求,但仔细思考一下,发现Consumer、Function、Predicate只有一个参数,如果我们开发项目过程中,怎么解决多个参数的情况呢?如果需要Supplier指定的数据类型,或者是返回某个指定类的子类呢?明显这种情况下无法满足我们的需求,在此情况下,Jdk8给我们提供了额外的函数式接口
比如:

// An highlighted block
Consumer  ->   BiConsumer、DoubleConsumer、IntConsumer...(java.util.function)
Function    ->    BiFunction、IntFunction、LongFunction...(java.util.function)
Predicate   ->    IntPredicate、IntPredicate、DoublePredicate...(java.util.function)
Supplier     ->    BooleanSupplier、IntSupplier、LongSupplier...(java.util.function)

还有很多扩展的函数式接口没列出来,如果有兴趣可以在java.utils.function包里查看

自定义函数式接口

这里才是我想说的,嘻嘻,如果你觉得Jdk8给你提供的函数式接口还不能满足你的胃口,或者说你想自己定义函数式接口。那么请看这里,我定义了四个函数式接口,分别是

基本函数式接口自定义函数式接口调用
ConsumerConsumerUtilsConsumerInstance
FunctionFunctionUtilsFunctionInstance
PredicatePredicateUtilsPredicateInstance
SupplierSupplierUtilsSupplierInstance

ConsumerUtils:

// An highlighted block
package com.cherry.blog.util.func.instance.utils;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * 自定义函数式接口
 *
 * @author weiliwang
 * @date 2023-6-18
 */
public class ConsumerUtils {

    @FunctionalInterface
    public interface ConsumerInterface1<A> {
        void consumer1(A a);

        default void preCheckConsumer1(A a) {
            if (a != null) {
                consumer1(a);
            }
        }
    }

    @FunctionalInterface
    public interface ConsumerInterface2<A, B> {
        void consumer2(A a, B b);

        default void preCheckConsumer2(A a, B b) {
            if (a != null && b != null) {
                consumer2(a, b);
            }
        }
    }

    @FunctionalInterface
    public interface ConsumerInterface3<A, B, C> {
        void consumer3(A a, B b, C c);

        default void preCheckConsumer3(A a, B b, C c) {
            if (a != null && b != null && c != null) {
                consumer3(a, b, c);
            }
        }
    }

    @FunctionalInterface
    public interface ConsumerInterface4<A, B, C, D> {
        void consumer4(A a, B b, C c, D d);

        default void preCheckConsumer4(A a, B b, C c, D d) {
            if (a != null && b != null && c != null && d != null) {
                consumer4(a, b, c, d);
            }
        }
    }

    @FunctionalInterface
    public interface ConsumerInterface5<A, B, C, D, E> {
        void consumer5(A a, B b, C c, D d, E e);

        default void preCheckConsumer5(A a, B b, C c, D d, E e) {
            if (a != null && b != null && c != null && d != null && e != null) {
                consumer5(a, b, c, d, e);
            }
        }
    }

    @FunctionalInterface
    public interface ConsumerInterface6<A, B, C, D, E, F> {
        void consumer6(A a, B b, C c, D d, E e, F f);

        default void preCheckConsumer5(A a, B b, C c, D d, E e, F f) {
            if (a != null && b != null && c != null && d != null && e != null && f != null) {
                consumer6(a, b, c, d, e, f);
            }
        }
    }

}

FunctionUtils

// An highlighted block
package com.cherry.blog.util.func.instance.utils;

/**
 * 自定义函数式接口
 *
 * @author weiliwang
 * @date 2023-6-18
 */
public class FunctionUtils {

    @FunctionalInterface
    public interface FunctionInterface1<A, R> {
        R function1(A a);

        default R preCheckFunction1(A a) {
            return a != null ? function1(a) : null;
        }
    }

    @FunctionalInterface
    public interface FunctionInterface2<A, B, R> {
        R function2(A a, B b);

        default R preCheckFunction2(A a, B b) {
            return (a != null && b != null) ? function2(a, b) : null;
        }
    }

    @FunctionalInterface
    public interface FunctionInterface3<A, B, C, R> {
        R function3(A a, B b, C c);

        default R preCheckFunction3(A a, B b, C c) {
            return (a != null && b != null && c != null) ? function3(a, b, c) : null;
        }
    }

    @FunctionalInterface
    public interface FunctionInterface4<A, B, C, D, R> {
        R function4(A a, B b, C c, D d);

        default R preCheckFunction4(A a, B b, C c, D d) {
            return (a != null && b != null && c != null && d != null) ? function4(a, b, c, d) : null;
        }
    }

    @FunctionalInterface
    public interface FunctionInterface5<A, B, C, D, E, R> {
        R function5(A a, B b, C c, D d, E e);

        default R preCheckFunction5(A a, B b, C c, D d, E e) {
            return (a != null && b != null && c != null && d != null && e != null) ? function5(a, b, c, d, e) : null;
        }
    }

    @FunctionalInterface
    public interface FunctionInterface6<A, B, C, D, E, F, R> {
        R function6(A a, B b, C c, D d, E e, F f);

        default R preCheckFunction6(A a, B b, C c, D d, E e, F f) {
            return (a != null && b != null && c != null && d != null && e != null && f != null) ? function6(a, b, c, d, e, f) : null;
        }
    }

}

PredicateUtils:

// An highlighted block
package com.cherry.blog.util.func.instance.utils;

/**
 * 自定义函数式接口
 *
 * @author weiliwang
 * @date 2023-6-18
 */
public class PredicateUtils {

    @FunctionalInterface
    public interface PredicateInterface1<A> {
        boolean predicate1(A a);

        default boolean preCheckPredicate1(A a) {
            return a != null && predicate1(a);
        }
    }

    @FunctionalInterface
    public interface PredicateInterface2<A, B> {
        boolean predicate2(A a, B b);

        default boolean preCheckPredicate2(A a, B b) {
            return a != null && b != null && predicate2(a, b);
        }
    }

    @FunctionalInterface
    public interface PredicateInterface3<A, B, C> {
        boolean predicate3(A a, B b, C c);

        default boolean preCheckPredicate3(A a, B b, C c) {
            return a != null && b != null && c != null && predicate3(a, b, c);
        }
    }

    @FunctionalInterface
    public interface PredicateInterface4<A, B, C, D> {
        boolean predicate4(A a, B b, C c, D d);

        default boolean preCheckPredicate4(A a, B b, C c, D d) {
            return a != null && b != null && c != null && d != null && predicate4(a, b, c, d);
        }
    }

    @FunctionalInterface
    public interface PredicateInterface5<A, B, C, D, E> {
        boolean predicate5(A a, B b, C c, D d, E e);

        default boolean preCheckPredicate5(A a, B b, C c, D d, E e) {
            return a != null && b != null && c != null && d != null && e != null && predicate5(a, b, c, d, e);
        }
    }

    @FunctionalInterface
    public interface PredicateInterface6<A, B, C, D, E, F> {
        boolean predicate6(A a, B b, C c, D d, E e, F f);

        default boolean preCheckPredicate6(A a, B b, C c, D d, E e, F f) {
            return a != null && b != null && c != null && d != null && e != null && f != null && predicate6(a, b, c, d, e, f);
        }
    }

}

SupplierUtils:

// An highlighted block
package com.cherry.blog.util.func.instance.utils;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 自定义函数式接口
 *
 * @author weiliwang
 * @date 2023-6-18
 */
public class SupplierUtils {

    public interface SupplierInterface<R> {
        R supplier();
    }

    public interface SupplierIntegerInterface<R extends Integer> {
        R supplier();
    }

    public interface SupplierStrInterface<R extends String> {
        R supplierStr();
    }

    public interface SupplierListInterface<R extends List> {
        R supplierList();
    }

    public interface SupplierSetInterface<R extends Set> {
        R supplierSet();
    }

    public interface SupplierMapInterface<R extends Map> {
        R supplierMap();
    }

}

ConsumerInstance:

// An highlighted block
package com.cherry.blog.util.func.instance;

import com.cherry.blog.util.func.instance.utils.ConsumerUtils;

/**
 * consumer自定义函数式接口
 *
 * @author weiliwang
 * @date 2023-6-18
 */
public class ConsumerInstance {

    public static <A> void consumer1(A a, ConsumerUtils.ConsumerInterface1<A> consumerInterface1) {
        consumerInterface1.preCheckConsumer1(a);
    }

    public static <A, B> void consumer2(A a, B b, ConsumerUtils.ConsumerInterface2<A, B> consumerInterface2) {
        consumerInterface2.preCheckConsumer2(a, b);
    }

    public static <A, B, C> void consumer3(A a, B b, C c, ConsumerUtils.ConsumerInterface3<A, B, C> consumerInterface3) {
        consumerInterface3.preCheckConsumer3(a, b, c);
    }

    public static <A, B, C, D> void consumer4(A a, B b, C c, D d, ConsumerUtils.ConsumerInterface4<A, B, C, D> consumerInterface4) {
        consumerInterface4.preCheckConsumer4(a, b, c, d);
    }

    public static <A, B, C, D, E> void consumer5(A a, B b, C c, D d, E e, ConsumerUtils.ConsumerInterface5<A, B, C, D, E> consumerInterface5) {
        consumerInterface5.preCheckConsumer5(a, b, c, d, e);
    }

    public static <A, B, C, D, E, F> void consumer6(A a, B b, C c, D d, E e, F f, ConsumerUtils.ConsumerInterface6<A, B, C, D, E, F> consumerInterface6) {
        consumerInterface6.preCheckConsumer5(a, b, c, d, e, f);
    }

}

FunctionInstance:

// An highlighted block
package com.cherry.blog.util.func.instance;

import com.cherry.blog.util.func.instance.utils.FunctionUtils;

/**
 * function自定义函数式接口
 *
 * @author weiliwang
 * @date 2023-6-18
 */
public class FunctionInstance {

    public static <A, R> R function1(A a, FunctionUtils.FunctionInterface1<A, R> functionInterface1) {
        return functionInterface1.preCheckFunction1(a);
    }

    public static <A, B, R> R function2(A a, B b, FunctionUtils.FunctionInterface2<A, B, R> functionInterface2) {
        return functionInterface2.preCheckFunction2(a, b);
    }

    public static <A, B, C, R> R function3(A a, B b, C c, FunctionUtils.FunctionInterface3<A, B, C, R> functionInterface3) {
        return functionInterface3.preCheckFunction3(a, b, c);
    }

    public static <A, B, C, D, R> R function4(A a, B b, C c, D d, FunctionUtils.FunctionInterface4<A, B, C, D, R> functionInterface4) {
        return functionInterface4.preCheckFunction4(a, b, c, d);
    }

    public static <A, B, C, D, E, R> R function5(A a, B b, C c, D d, E e, FunctionUtils.FunctionInterface5<A, B, C, D, E, R> functionInterface5) {
        return functionInterface5.preCheckFunction5(a, b, c, d, e);
    }

    public static <A, B, C, D, E, F, R> R function6(A a, B b, C c, D d, E e, F f, FunctionUtils.FunctionInterface6<A, B, C, D, E, F, R> functionInterface6) {
        return functionInterface6.preCheckFunction6(a, b, c, d, e, f);
    }
}

PredicateInstance:

// An highlighted block
package com.cherry.blog.util.func.instance;

import com.cherry.blog.util.func.instance.utils.PredicateUtils;

/**
 * Predicate自定义函数式接口
 *
 * @author weiliwang
 * @date 2023-6-18
 */
public class PredicateInstance {

    public static <A> boolean predicate1(A a, PredicateUtils.PredicateInterface1<A> predicateInterface1) {
        return predicateInterface1.preCheckPredicate1(a);
    }

    public static <A, B> boolean predicate2(A a, B b, PredicateUtils.PredicateInterface2<A, B> predicateInterface2) {
        return predicateInterface2.preCheckPredicate2(a, b);
    }

    public static <A, B, C> boolean predicate3(A a, B b, C c, PredicateUtils.PredicateInterface3<A, B, C> predicateInterface3) {
        return predicateInterface3.preCheckPredicate3(a, b, c);
    }

    public static <A, B, C, D> boolean predicate4(A a, B b, C c, D d, PredicateUtils.PredicateInterface4<A, B, C, D> predicateInterface4) {
        return predicateInterface4.preCheckPredicate4(a, b, c, d);
    }

    public static <A, B, C, D, E> boolean predicate5(A a, B b, C c, D d, E e, PredicateUtils.PredicateInterface5<A, B, C, D, E> predicateInterface5) {
        return predicateInterface5.preCheckPredicate5(a, b, c, d, e);
    }

    public static <A, B, C, D, E, F> boolean predicate6(A a, B b, C c, D d, E e, F f, PredicateUtils.PredicateInterface6<A, B, C, D, E, F> predicateInterface6) {
        return predicateInterface6.preCheckPredicate6(a, b, c, d, e, f);
    }

}

SupplierInstance:

// An highlighted block
package com.cherry.blog.util.func.instance;

import com.cherry.blog.util.func.instance.utils.SupplierUtils;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * supplier自定义函数式接口
 *
 * @author weiliwang
 * @date 2023-6-18
 */
public class SupplierInstance {

    public static <R> R supplier(SupplierUtils.SupplierInterface<R> supplierInterface) {
        return supplierInterface.supplier();
    }

    public static <R extends Integer> R supplierInteger(SupplierUtils.SupplierIntegerInterface<R> supplierIntegerInterface) {
        return supplierIntegerInterface.supplier();
    }

    public static <R extends String> R supplierStr(SupplierUtils.SupplierStrInterface<R> supplierStrInterface) {
        return supplierStrInterface.supplierStr();
    }

    public static <R extends List> R supplierList(SupplierUtils.SupplierListInterface<R> supplierListInterface) {
        return supplierListInterface.supplierList();
    }

    public static <R extends Set> R supplierSet(SupplierUtils.SupplierSetInterface<R> supplierSetInterface) {
        return supplierSetInterface.supplierSet();
    }

    public static <R extends Map> R supplierMap(SupplierUtils.SupplierMapInterface<R> supplierMapInterface) {
        return supplierMapInterface.supplierMap();
    }


}

自定义函数式调用方式

TestDemo(配合lambda使用):

// TestDemo
public class TestDemo {


    public static void main(String[] args) {
        Student student1 = Student.builder()
                .studentId(1L)
                .name("junwu")
                .age(27)
                .className("computer")
                .build();
        Student student2 = Student.builder()
                .studentId(2L)
                .name("taoyang")
                .age(29)
                .className("math")
                .build();
        Teacher teacher = Teacher.builder()
                .teacherId(1L)
                .teacherName("weiliwang")
                .age(28)
                .className("computer")
                .studentList(Arrays.asList(student1, student2))
                .build();
        consumerTest(teacher);
        functionTest(teacher);
        predicateTest(teacher);
        SupplierTest(teacher);

    }

    //查找junwu学生的信息
    public static void consumerTest(Teacher teacher) {
        ConsumerInstance.consumer1(teacher, t -> {
            System.out.println(t.getStudentList().stream()
            .filter(stu -> StringUtils.equalsIgnoreCase(stu.getName(), "junwu"))
            .findFirst().get());
        });
    }

    //查找junwu学生所在的学科
    public static void functionTest(Teacher teacher) {
        Optional<String> classNameOptional = FunctionInstance.function1(teacher, t -> {
            return t.getStudentList().stream()
                    .filter(stu -> StringUtils.equalsIgnoreCase(stu.getName(), "junwu"))
                    .findFirst()
                    .map(Student::getClassName);
        });
        classNameOptional.ifPresent(System.out::println);
    }

    //查找是否存在taoyang学生
    public static void predicateTest(Teacher teacher) {
        System.out.println(PredicateInstance.predicate1(teacher, t -> t.getStudentList().stream()
                .anyMatch(stu -> StringUtils.equalsIgnoreCase(stu.getName(), "taoyang"))));
    }

    //新增chengyang学生信息
    public static void SupplierTest(Teacher teacher) {
        System.out.println(SupplierInstance.supplier(() -> Student.builder()
                .studentId(3L)
                .name("chengyang")
                .age(27)
                .className("math")
                .build()));
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值