Java学习之函数式接口

what(是什莫)

函数式接口(Function Interface)指的是有且只有一个抽象方法的接口,但是可以有多个非抽象方法。

函数接口可以用来支持lambda表达式,lambda表达式作为函数接口中抽象方法的具体实现使用

how(怎末做)

接口的创建方式和普通接口类似,不同的是只有一个方法

interface Tes{
	void add();
}

可以在接口上加注解@FunctionalInterface强制实行
同时在Java中也提供一系列的接口供使用

接口

描述

BiConsumer<T,U>

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

BiFunction<T,U,R>

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

BinaryOperator<T,>

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

BiPredicate<T,U>

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

BooleanSupplier

代表了boolean值结果的提供方

Consumer<T,>

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

DoubleBinaryOperator

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

DoubleConsumer

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

DoubleFunction<R,>

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

DoublePredicate

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

DoubleSupplier

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

DoubleToIntFunction

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

DoubleToLongFunction

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

DoubleUnaryOperator

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

Function<T,R>

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

IntBinaryOperator

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

IntConsumer

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

IntFunction<R,>

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

IntPredicate

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

IntSupplier

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

IntToDoubleFunction

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

IntToLongFunction

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

IntUnaryOperator

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

LongBinaryOperator

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

LongConsumer

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

LongFunction<R,>

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

LongPredicate

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

LongSupplier

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

LongToDoubleFunction

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

LongToIntFunction

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

LongUnaryOperator

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

ObjDoubleConsumer<T,>

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

ObjIntConsumer<T,>

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

ObjLongConsumer<T,>

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

Predicate<T,>

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

Supplier<T,>

无参数,返回一个结果

ToDoubleBiFunction<T,U>

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

Supplier<T,>

无参数,返回一个结果

ToDoubleBiFunction<T,U>

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

ToDoubleFunction<T,>

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

ToIntBiFunction<T,U>

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

ToIntFunction<T,>

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

ToLongBiFunction<T,U>

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

ToLongFunction<T,>

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

UnaryOperator<T,>

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

其中Consumer<T,>,Function<T,R>,Supplier<T,>,Predicate<T,>是四个核心接口

使用已经创建好的接口配合lambda表达式可以快速实现某些功能,使用方式如下

BiConsumer<Integer,Integer> bc = (a,b) -> System.out.println("hello lambda");
bc.accept(2, 1);  // 调用接口中方法

BooleanSupplier bu = () -> true;
System.out.println(bu);;

DoubleToIntFunction dtf = (d) -> (int)d;
System.out.println(dtf.applyAsInt(2.3));


System.out.println(duo.applyAsDouble(2.3));

Supplier sl = () -> true;
System.out.println(sl.get());

why(为什莫)

好处:
1,配合使用lambad表达式
2,以接口作为参数传入方法,针对不同的处理编写不用的实现方式

例如:

public static void main(String args[]){
  List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    
  // Predicate<Integer> predicate = n -> true
  // n 是一个参数传递到 Predicate 接口的 test 方法
  // n 如果存在则 test 方法返回 true
    
  System.out.println("输出所有数据:");
    
  // 传递参数 n
  eval(list, n->true);
    
  // Predicate<Integer> predicate1 = n -> n%2 == 0
  // n 是一个参数传递到 Predicate 接口的 test 方法
  // 如果 n%2 为 0 test 方法返回 true
    
  System.out.println("输出所有偶数:");
  eval(list, n-> n%2 == 0 );
    
  // Predicate<Integer> predicate2 = n -> n > 3
  // n 是一个参数传递到 Predicate 接口的 test 方法
  // 如果 n 大于 3 test 方法返回 true
    
  System.out.println("输出大于 3 的所有数字:");
  eval(list, n-> n > 3 );
}

 public static void eval(List<Integer> list, Predicate<Integer> predicate) {
  for(Integer n: list) {
    
     if(predicate.test(n)) {
        System.out.println(n + " ");
     }
  }
 }