Java8 - 功能性接口教程与实例

425 阅读4分钟

Java8 functional interface example

什么是Java 8功能接口?

Functional Interfaces 是Java 8中引入的新概念。

这个名字本身就说明它是一个只包含抽象方法的接口。
重要的是,这个接口的实例是由lambda expressions,method referencesconstructor references 创建的。

这是在Java 8中引入的函数式编程的概念。

Java 8,允许创建一个自定义的函数式接口,以及使用内置的函数式接口。

java8函数式接口的特点

  • 它只包含单一的抽象方法,提出单一的功能
  • 可以声明许多默认和静态方法
  • 可以声明对象类的方法
  • 它可以扩展非功能接口
  • 它可以扩展另一个没有任何抽象方法的接口

java8 @FunctionalInterface注解示例

这是为函数式接口引入的一个新注解。

它标记了功能化编程的接口。

它可以用来在编译阶段检查代码。这个注解不是必须使用的,你仍然可以在lambda表达式中使用这些接口。

java.util.function 包包含各种内置的功能接口

自定义功能接口示例

这是一个创建我们自定义功能接口的例子。

通过注解@FunctionalInterface ,创建了MultiplyFunctionalInterface

它只有一个抽象的方法,没有提供实现。编写lambda表达式来实现功能接口

public class FunctionalInterfaceExample {
    public static void main(String[] args) {
        MultiplyFunctionalInterface mfi = (value1, value2) -> value1 * value2;
        System.out.println(mfi.multiply(5, 6));

    }
}

@FunctionalInterface
interface MultiplyFunctionalInterface {
    public Integer multiply(Integer value1, Integer value2);
}

预定义功能接口的例子

这是一个使用现有功能接口的例子。LongBinaryOperatorjava.util.function 包中的一个功能接口。它接收两个值,并生成单一的输出。在下面的例子中使用了applyAsLong 方法。

import java.util.function.LongBinaryOperator;
public class InbuiltFunctionExamle {
    public static void main(String args[]) {
        LongBinaryOperator add = (value1, value2) -> value1+ value2;
        System.out.println(add.applyAsLong(5, 400));

    }
}  

和输出:

405

功能接口的例子

我们将看到有效和无效的功能接口例子

  • 有效的功能接口例子

下面的例子是一个有效的功能接口,一个方法是一个单一的抽象方法toString ,而Object类中的equals可以被重写。

@FunctionalInterface
interface MyInterface {
    int method(int a, int b);
    @Override
    public String toString();
    @Override
    public boolean equals(Object obj);
}  

  • 无效的功能接口示例

下面的例子是无效的功能接口,在编译时抛出错误'Invalid '@FunctionalInterface' annotation; is not a functional interface' 下面的接口有两个抽象方法,只允许有一个抽象方法。

@FunctionalInterface  
interface InvalidFunctionalInterface {  
    public Integer method(Integer value1, Integer value2);  
    public Integer method1(Integer value1, Integer value2);  
}  

这个函数式接口正在扩展另一个有抽象方法的非函数式接口。如果它上面没有抽象方法,它应该是有效的

interface NonFunctionalInterface{
    void method();
}
@FunctionalInterface
interface FunctionalInterfaceHello extends NonFunctionalInterface{
    void method1();
} 

java.util.function包的接口和实现类

java.util.function java8中的包包含了各种预定义的功能接口。

接口描述
函数这指定了一般的函数,以一个参数作为输入并输出结果。
谓词输出一个具有单一参数的条件表达式
消费者它指定了一个操作,只接受一个参数,不输出结果。
供应者它返回结果的提供者
整数供应商(IntSupplier用作整数结果的供应者
DoubleSupplier用作双数结果的供应商
[LongSupplier](/java8-primitive-supplier-example)作为Long结果的供应商使用
布尔型供应商作为布尔结果的供应商使用
IntConsumer它是一个接受整数值的消费者,不返回任何结果
DoubleConsumer该接口接受双倍值,不返回结果
LongConsumer代表接受长值且不返回结果的消费者
UnaryOperator它是一个操作数,并返回相同的结果类型
IntUnaryOperator接受整数参数并返回整数结果。
DoubleUnaryOperator输入的是双数参数,并返回双数结果
长单数运算器(LongUnaryOperator取长参数作为输入,并返回长的结果
ToIntBiFunction它接受两个整数参数作为输入,并返回整数结果。
ToLongBiFunction它接受两个长参数作为输入并返回长的结果。
ToDoubleBiFunction它接受两个双数参数作为输入并返回双数结果。
ToIntFunction它接受任何数值,并返回一个唯一的整数值。
ToLongFunction它接受任何值,只返回长的结果。
IntToLongFunction它接受整数值,只返回长值
ToDoubleFunction它接受任何值,只返回双倍的结果。
LongToIntFunction它接受Long值,只返回整数值。
IntToDoubleFunction它接受整数值,只返回双倍的结果。
DoubleToLongFunction它接受双倍值并只返回长值
LongToDoubleFunction它接受长值并只返回双倍值。
IntFunction它接受整数值并返回给定值的数据类型。
LongFunction它接受长值并返回给定值的数据类型。