43个函数式接口——Java8新特性

43个函数式接口

函数式接口

Lambda表达式用来实现SAM接口的,SAM(Single Abstract Method)接口中只有一个抽象方法需要实现,当然该接口可以包含其他非抽象的方法。满足“SAM“特征的接口都可以称为函数式接口(就是用来简化编程模型的),但是如果要更明确一点,最好在声明接口时,在上面加上**@FunctionalInterface**

JDK8之前核心类库中就已经存在很多SAM接口了:

  • java.lang.Iterable
  • java.io.FileFilter
  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.util.Comparator
  • java.lang.reflect.InvocationHandler

但是在JDK8中只有后三种加了@FunctionalInterface,那些没有加注解的SAM接口现在可以使用Lambda表达式,但是存在将来增加抽象方法变成非SAM接口的风险,所以建议只对加了@FunctionalInterface的接口使用Lambda表达式实现

JDK8中,在java.util.function包中增加了很多函数式接口,不过他们可以归纳为四类:消费型接口、供给型接口、功能型接口、断言型接口。一共43个。基本上是可以满足开发中函数式接口的基本使用需求。

注意下面列出的每种类型的接口,第一个接口通常是是我们最常用的接口。都用第一个来举例子:

消费型接口

8个。特点:有参无返回值

接口名 抽象方法 描述
Consumer void accept(T t) 接收一个对象用于完成功能
BiConsumer void accept(T t,U u) 接收一个对象用于完成功能
DoubleConsumer void accept(double value) 接收一个double值
IntConsumer void accept(int value) 接收一个int值
LongConsumer void accept(long value) 接收一个long值
ObjDoubleConsumer void accept(T t,double value) 接收一个对象和一个double值
ObjIntConsumer void accept(T t,int value) 接收一个对象和一个int值
ObjLongConsumer void accept(T t,long value) 接收一个对象和一个long值
        //Consumer消费型接口,传入一个值,方法体中可以随意定义怎么消费
        Consumer<String> consumer = (x)-> System.out.println(x.toUpperCase());
        consumer.accept("hello");

供给型接口

5个。特点:无参有返回值

接口名 抽象方法 描述
Supplier T get() 返回一个T类型结果
BooleanSupplier boolean getAsBoolean() 返回一个boolean类型结果
DoubleSupplier double getAsDouble() 返回一个double类型结果
IntSupplier int getAsInt() 返回一个int类型结果
LongSupplier long getAsLong() 返回一个long类型结果
        //Supplier供给型接口,返回一个任意类型的对象
        Supplier<Double> supplier = ()-> Math.random();//返回一个随机的0~1之间的小数
        System.out.println(supplier.get());

断言型接口

5个。特点:有参返回boolean类型的结果

接口名 抽象方法 描述
Predicate boolean test(T t) 接收一个对象
BiPredicate boolean test(T t,U u) 接收两个对象
DoublePredicate boolean test(double value) 接收一个double值
IntPredicate boolean test(int value) 接收一个int值
LongPredicate boolean test(long value) 接收一个long值
        //Predicate断言型接口,返回值一定是true或false
        Predicate<Integer> predicate = (n)-> { return n % 2 == 0; };//判断传入的整数是否为偶数
        int n = 100;
        System.out.println(n+"是否为偶数:"+predicate.test(n));

功能型接口

25个。特点:既有参数也有返回值

接口名 抽象方法 描述
Function R apply(T t) 接收一个T类型对象,返回一个R类型对象
UnaryOperator R apply(T t) 接收一个T类型对象,返回一个T类型对象
DoubleFunction R apply(double value) 接收一个double值,返回一个R类型对象
IntFunction R apply(int value) 接收一个int值,返回一个R类型对象
LongFunction R apply(long value) 接收一个long值,返回一个R类型对象
ToDoubleFunction double applyAsDouble(T value) 接收一个类型对象,返回一个double值
ToIntFunction int applyAsInt(T value) 接收一个类型对象,返回一个int值
ToLongFunction long applyAsLong(T value) 接收一个类型对象,返回一个long值
DoubleToIntFunction int applyAsInt(double value) 接收一个double值,返回一个int结果
DoubleToLongFunction long applyAsInt(double value) 接收一个double值,返回一个long值
IntToDoubleFunction double applyAsInt(int value) 接收一个int值,返回一个double值
IntToLongFunction long applyAsInt(int value) 接收一个int值,返回一个long值
LongToDoubleFunction double applyAsInt(long value) 接收一个long值,返回一个double值
LongToIntFunction int applyAsInt(long value) 接收一个long值,返回一个int值
DoubleUnaryOperator double applyAsDouble(double operand) 接收一个double,返回一个double
IntUnaryOperator int applyAsInt(int operand) 接收一个int,返回一个int
LongUnaryOperator long applyAsLong(long operand) 接收一个long,返回一个long
BiFunction R apply(T t,U u) 接收一个T类型和一个U类型的对象,返回一个R类型的结果
BinaryOperator T apply(T t1,T t2) 接收两个T类型的对象,返回一个T类型的结果
ToDoubleBiFunction double applyAsDouble(T t,U u) 接收一个T类型和一个U类型的对象,返回一个double
ToIntBiFunction int applyAsInt(T t,U u) 接收一个T类型和一个U类型的对象,返回一个int
ToLongBiFunction long applyAsLong(T t,U u) 接收一个T类型和一个U类型的对象,返回一个long
DoubleBinaryOperator double applyAsDouble(double left,double right) 接收两个double类型的对象,返回一个double
IntBinaryOperator int applyAsInt(int left,int right) 接收两个int类型的对象,返回一个int
LongBinaryOperator long applyAsLong(long left,long right) 接收两个long类型的对象,返回一个long
        //Function功能型接口,传入一个任意类型对象,返回一个任意类型对象
        Function<String,Integer> function = (str)->{
            int n=0;
            for (int i=0;i<str.length();i++){
                if (Character.isDigit(str.charAt(i))){
                    n++;
                }
            }
            return n;
        };
        String str = "abc123123123";
        System.out.println(str+"中的数字个数为:"+function.apply(str));

你可能感兴趣的:(Java8新特性,java,编程语言,lambda,接口)