编程语言
首页 > 编程语言> > Java里面的functional interface

Java里面的functional interface

作者:互联网

1.函数式编程

在介绍functional interface前,先简单说明一下函数式编程

函数式编程的定义如下:“函数式编程是一种编程范式。它把计算当成是数学函数的求值,从而避免改变状态和使用可变数据。它是一种声明式的编程范式,通过表达式和声明而不是语句来编程

对函数式编程支持程度高低的一个重要特征是函数是否作为编程语言的一等公民出现,也就是编程语言是否有内置的结构来表示函数。作为面向对象的编程语言,Java 中使用接口来表示函数

functional interface 是在JDK 8里面引入的,定义在
jls-9.8 里面,一种特殊的接口

2.functional interface

先看一下interface的一些特点:

2.1 functional interface特点

Java中的functional interface是仅包含一个抽象(未实现)方法的接口。 除了单个未实现的方法外,functional interface还可以包含具有实现的default方法和static方法。

functional interface口中可以额外定义多个抽象方法,但这些抽象方法签名必须和Object的public方法一样,因为接口中定义的方法都是public类型的

总结一下,一个functional interface可以包含

一个简单的例子

@FunctionalInterface
public interface MyFunctionInterface {

    int print();

    default String getName() {
        return "chadm";
    }

    static boolean notNullAndEmpty(String name) {
        return name != null && !name.equals("");
    }

    public String toString();

    public boolean equals(Object var1);
}

一个Java functional interface 可以通过一个Java Lambda表达式来实现

一个Java Lambda表达式实现了一个Java interface的单个方法,interface只能包包含有一个未实现的方法,换句话说,就是这个接口是一个Java functional interface

2.2 functional interface的简单使用

java.util.function中定义了几组类型的函数式接口以及针对基本数据类型的子接口。

简单用法

Function<Integer,Integer> addOne = (value) -> value+1;
System.out.println(addOne.apply(8));
        
Predicate predicate = (value) -> value != null;
System.out.println(predicate.test(null));

Supplier<Integer> supplier = () -> new Integer((int) (Math.random() * 1000D));
System.out.println(supplier.get());

Consumer<Integer> consumer = (value) -> System.out.println(value);
consumer.accept(101);

UnaryOperator<Person> unaryOperator =
                (person) -> { person.name = "chadm"; return person; };
Person me = new Person();
System.out.println(unaryOperator.apply(me));

BinaryOperator<Integer> binaryOperator = (x1, x2) -> x1 + x2;
System.out.println(binaryOperator.apply(100,1));

详细代码可以参考functioninterface

上面定义的都是单个操作,复合操作有

在需要functional interface的任何地方,我们都有三种选择

In addition to the usual process of creating an interface instance by declaring and instantiating a class (§15.9), instances of functional interfaces can be created with method reference expressions and lambda expressions (§15.13, §15.27).

方法引用有如下几个:

ExpressionName :: [TypeArguments] Identifier
ReferenceType :: [TypeArguments] Identifier
Primary :: [TypeArguments] Identifier
super :: [TypeArguments] Identifier
TypeName . super :: [TypeArguments] Identifier
ClassType :: [TypeArguments] new
ArrayType :: new

注释类型**@FunctionalInterface**用于表示接口应作为functional interface(§9.8),它有助于及早发现不正确的方法声明。

可以使用不带@FunctionalInterface注解的lambda,就像可以不使用@Override注解来复写方法一样

参考:

标签:Java,functional,接口,interface,方法,public
来源: https://blog.csdn.net/weixin_42695485/article/details/110294201