1.什么是函数式接口?

  • 只包含一个抽象方法的接口,称为函数式接口
  • 你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)
  • 我们可以在任意函数式接口上使用@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口

2.四大函数式接口的使用

函数接口如果使用的好能让我们的代码变得较为简洁,且减少重复代码。

2.1. Consumer<T> 消费型接口,有入参,无返回值

源码:

@FunctionalInterface
public interface Consumer<T> {
 
    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
}

例子 设置属性name和nameDesc的值:

public static void main(String[] args) {
        List<UserInfo> userInfoList = getUserList();
        userInfoList.forEach(obj -> {
            functionTest(obj::setName);
            functionTest(obj::setNameDesc);
            System.out.println(obj);
        });
    }


    public static void functionTest(Consumer<String> consumer){
        consumer.accept("name");
    }

2.2 Function<T, R> 函数型接口 有入参 有返回值

源码:

@FunctionalInterface
public interface Function<T, R> {
 
    /**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);

}

例子 获取属性nameDesc的值:

public static void main(String[] args) {
        List<UserInfo> userInfoList = getUserList();
        userInfoList.forEach(obj -> {
            functionTest(obj, UserInfo::getNameDesc);
        });
    }


    public static void functionTest(UserInfo userInfo, Function<UserInfo, String> function){
        String apply = function.apply(userInfo);
        System.out.println(apply);
}

2.3 Supplier<T> 提供型接口 空参但是有返回值

源码:

@FunctionalInterface
public interface Supplier<T> {
 
   /**
    * Gets a result.
    *
    * @return a result
    */
   T get();
}

例子 获取属性nameDesc的值:

public static void main(String[] args) {
        List<UserInfo> userInfoList = getUserList();
        userInfoList.forEach(obj -> {
            functionTest(obj::getNameDesc);
        });
    }


    public static void functionTest(Supplier<String> supplier){
        String s = supplier.get();
    }

2.4 Predicat<T> 断言型接口 返回真假

源码:

@FunctionalInterface
public interface Predicate<T> {
 
    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
}

例子 计算一个数字是否大于100: 

public static void main(String[] args) {
        functionTest(50, x -> x > 100);
    }


    public static void functionTest(int x, Predicate<Integer> predicate){
        boolean test = predicate.test(x);
        System.out.println(test);
    }

3.其他函数式接口

序号

接口

描述

1

BiConsumer<T,U>

代表了一个接受两个输入参数的操作,并且不返回任何结果

2

BiFunction<T,U,R>

代表了一个接受两个输入参数的方法,并且返回一个结果

3

BinaryOperator<T>

代表了一个作用于于两个同类型操作符的操作,并且返回了

操作符同类型的结果

4

BiPredicate<T,U>

代表了一个两个参数的boolean值方法

5

BooleanSupplier

代表了boolean值结果的提供方

6

Consumer<T>

代表了接受一个输入参数并且无返回的操作

7

DoubleBinaryOperator

代表了作用于两个double值操作符的操作,并且返回了

一个double值的结果

8

DoubleConsumer

代表一个接受double值参数的操作,并且不返回结果。

9

DoubleFunction<R>

代表接受一个double值参数的方法,并且返回结果

10

DoublePredicate

代表一个拥有double值参数的boolean值方法

11

DoubleSupplier

代表一个double值结构的提供方

12

DoubleToIntFunction

接受一个double类型输入,返回一个int类型结果

13

DoubleToLongFunction

接受一个double类型输入,返回一个long类型结果

14

DoubleUnaryOperator

接受一个参数同为类型double,返回值类型也为double

15

Function<T,R>

接受一个输入参数,返回一个结果。

16

IntBinaryOperator

接受两个参数同为类型int,返回值类型也为int 

17

IntConsumer

接受一个int类型的输入参数,无返回值 

18

IntFunction<R>

接受一个int类型输入参数,返回一个结果 。

19

IntPredicate

接受一个int输入参数,返回一个布尔值的结果

20

IntSupplier

无参数,返回一个int类型结果

21

IntToDoubleFunction

接受一个int类型输入,返回一个double类型结果 

22

IntToLongFunction

接受一个int类型输入,返回一个long类型结果

23

IntUnaryOperator

接受一个参数同为类型int,返回值类型也为int 

24

LongBinaryOperator

接受两个参数同为类型long,返回值类型也为long

25

LongConsumer

接受一个long类型的输入参数,无返回值

26

LongFunction<R>

接受一个long类型输入参数,返回一个结果

27

LongPredicate

R接受一个long输入参数,返回一个布尔值类型结果

28

LongSupplier

无参数,返回一个结果long类型的值

29

LongToDoubleFunction

接受一个long类型输入,返回一个double类型结果

30

LongToIntFunction

接受一个long类型输入,返回一个int类型结果

31

LongUnaryOperator

接受一个参数同为类型long,返回值类型也为long

32

ObjDoubleConsumer<T>

接受一个object类型和一个double类型的输入参数,无返回值

33

ObjIntConsumer<T>

接受一个object类型和一个int类型的输入参数,无返回值

34

ObjLongConsumer<T>

接受一个object类型和一个long类型的输入参数,无返回值

35

Predicate<T>

接受一个输入参数,返回一个布尔值结果

36

Supplier<T>

无参数,返回一个结果

37

ToDoubleBiFunction<T,U>

接受两个输入参数,返回一个double类型结果

38

ToDoubleFunction<T>

接受一个输入参数,返回一个double类型结果

39

ToIntBiFunction<T,U>

接受两个输入参数,返回一个int类型结果

40

ToIntFunction<T>

接受一个输入参数,返回一个int类型结果

41

ToLongBiFunction<T,U>

接受两个输入参数,返回一个long类型结果

42

ToLongFunction<T>

接受一个输入参数,返回一个long类型结果

43

UnaryOperator<T>

接受一个参数为类型T,返回值类型也为T