JDK8系列之Functional Interfaces教程和示例

Posted smileNicky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK8系列之Functional Interfaces教程和示例相关的知识,希望对你有一定的参考价值。

JDK8系列之Functional Interfaces教程和示例

前面章节的学习中,我们学习了JDK8的lambada表达式和方法引用,接着,本章节继续学习jdk8的一个重要特性Functional Interfaces,翻译过来就是函数式接口

1、什么是Functional Interfaces?

什么是函数式接口,Functional Interfaces?函数式接口是jdk8的新特性之一,函数式接口是只包含一个抽象方法声明的接口。比如java.lang.Runnable就是一种函数式接口,在 Runnable 接口中只声明了一个方法 void run()

package java.lang;
@FunctionalInterface
public interface Runnable {
    void run();
}

Lambda 表达式、构造函数、方法引用都能隐式地赋值给函数式接口

使用lambada表达式赋值给Runnable函数式接口

Runnable r = () -> System.out.println("hello world");

等价于:

new Runnable() {
    @Override
    public void run() {
        System.out.println("hello world");
    }
};

2、@FunctionalInterface 注解

使用@FunctionalInterface注解用于自定义一个函数式接口,下面给出一个例子:

  • ①定义一个@FunctionalInterface
 @FunctionalInterface
 interface AddInterface {
     int addMethod(int a , int b);
 }
  • ② 调用FunctionalInterface
 // example 2 : FunctionalInterface自定义接口
 AddInterface addInterface = (a , b) -> a + b;
 System.out.println(String.format("两个数字相加:%s" , addInterface.addMethod(10,24)));

3、使用java.util.function的函数式接口

java.util.function提供了很多的函数式接口,可以称之为 predefined functional interface

序号函数式接口描述说明
1BiConsumer<T,U>代表了一个接受两个输入参数的操作,并且不返回任何结果
2BiFunction<T,U,R>代表了一个接受两个输入参数的方法,并且返回一个结果
3BinaryOperator<T>代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
4BiPredicate<T,U>代表了一个两个参数的boolean值方法
5BooleanSupplier代表了boolean值结果的提供方
6Consumer<T>代表了接受一个输入参数并且无返回的操作
7DoubleBinaryOperator代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
8DoubleConsumer代表一个接受double值参数的操作,并且不返回结果。
9DoubleFunction<R>代表接受一个double值参数的方法,并且返回结果
10DoublePredicate代表一个拥有double值参数的boolean值方法
11DoubleSupplier代表一个double值结构的提供方
12DoubleToIntFunction接受一个double类型输入,返回一个int类型结果。
13DoubleToLongFunction接受一个double类型输入,返回一个long类型结果
14DoubleUnaryOperator接受一个参数同为类型double,返回值类型也为double 。
15Function<T,R>接受一个输入参数,返回一个结果。
16IntBinaryOperator接受两个参数同为类型int,返回值类型也为int 。
17IntConsumer接受一个int类型的输入参数,无返回值 。
18IntFunction<R>接受一个int类型输入参数,返回一个结果 。
19IntPredicate:接受一个int输入参数,返回一个布尔值的结果。
20IntSupplier无参数,返回一个int类型结果。
21IntToDoubleFunction接受一个int类型输入,返回一个double类型结果 。
22IntToLongFunction接受一个int类型输入,返回一个long类型结果。
23IntUnaryOperator接受一个参数同为类型int,返回值类型也为int 。
24LongBinaryOperator接受两个参数同为类型long,返回值类型也为long。
25LongConsumer接受一个long类型的输入参数,无返回值。
26LongFunction<R>接受一个long类型输入参数,返回一个结果。
27LongPredicateR接受一个long输入参数,返回一个布尔值类型结果。
28LongSupplier无参数,返回一个结果long类型的值。
29LongToDoubleFunction接受一个long类型输入,返回一个double类型结果。
30LongToIntFunction接受一个long类型输入,返回一个int类型结果。
31LongUnaryOperator接受一个参数同为类型long,返回值类型也为long。
32ObjDoubleConsumer<T>接受一个object类型和一个double类型的输入参数,无返回值。
33ObjIntConsumer<T>接受一个object类型和一个int类型的输入参数,无返回值。
34ObjLongConsumer<T>接受一个object类型和一个long类型的输入参数,无返回值。
35Predicate<T>接受一个输入参数,返回一个布尔值结果。
36Supplier<T>无参数,返回一个结果
37ToDoubleBiFunction<T,U>接受两个输入参数,返回一个double类型结果
38ToDoubleFunction<T>接受一个输入参数,返回一个double类型结果
39ToIntBiFunction<T,U>接受两个输入参数,返回一个int类型结果
40ToIntFunction<T>接受一个输入参数,返回一个int类型结果。
41ToLongBiFunction<T,U>接受两个输入参数,返回一个long类型结果。
42ToLongFunction<T>接受一个输入参数,返回一个long类型结果
43UnaryOperator<T>接受一个参数为类型T,返回值类型也为T。

java.util.function里的函数式接口例子:


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

public class FunctionalInterfacesExample {

    public static void main(String[] args) {
        // example : java.util.function函数接口应用
        // Consumer接口接收一个参数,不返回参数
        consumerFun(1 , v -> {System.out.println(v);});
        // binConsumer 接收两个参数,返回0个参数
        binConsumerFun("hello", "world" , (a ,b) -> {
            System.out.println(a + b);
        });
        // Predicate 接收一个参数,返回一个boolean值
        System.out.println(predicateFun(3 , a -> a ==3));
        // Predicate 接收0个参数,返回一个值
        System.out.println(supplierFun(() -> 1));
    }

    public static void consumerFun(int value, Consumer<Integer> c) {
        c.accept(value);
    }

    public static void binConsumerFun(String a , String b, BiConsumer<String , String> binc) {
        binc.accept(a , b);
    }

    public static boolean predicateFun(int value, Predicate<Integer> pre) {
        return pre.test(value);
    }

    public static int supplierFun(Supplier<Integer> supplier) {
        return supplier.get();
    }

   
}

附录:参考资料

以上是关于JDK8系列之Functional Interfaces教程和示例的主要内容,如果未能解决你的问题,请参考以下文章

JDK8系列之Method References教程和示例

JDK8系列之Stream API入门教程和示例

JDK8系列之default定义接口的默认实现方法

JDK8系列之使用Function函数式接口实现回调

JDK8系列之Lambda表达式教程和示例

JDK8系列之使用Function函数式接口实现回调