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