合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
> ### 函式接口 简单来说就是**只定义了一个抽象方法**的接口(Object类的public方法除外),就是函数式接口,并且还提供了注解:**@FunctionalInterface** 常见的四大函式接口: - Consumer 《T》:消费型接口,有参无返回值 - Supplier 《T》:供给型接口,无参有返回值 - Function 《T,R》::函数式接口,有参有返回值 - Predicate《T》: 断言型接口,有参有返回值,返回值是boolean类型 在四大核心函数式接口基础上,还提供了诸如BiFunction、BinaryOperation、toIntFunction等扩展的函数式接口,都是在这四种函数式接口上扩展而来的,不做赘述。 **总结:函数式接口的提出是为了让我们更加方便的使用lambda表达式,不需要自己再手动创建一个函数式接口,直接拿来用就好了.** > ### Lambda表达式 lambda表达式本质上是一段匿名内部类,也可以是一段可以传递的代码。实际上lambda表达式就是函式接口的实现。lambda表达式的参数列表与返回值类型要与函式接口的抽象方法的参数列表与返回类型一致。 Lambad表达式构成,()->{};左侧括号表示参数列表,当只有一个参数时,可以省略括号,{}表示lambad的主体,即方法的实现部分,当lambad的主体只有一条语句你时,可以省略{},如果方法需要返回值,也可以省略return。用->来分隔参数列表和Lambad主体。 ep: ``` long a = 12L; Function<Long, String> function = l -> l + ""; System.out.println(function.apply(12L)); ``` > ### 方法的引用 若lambda体中的内容有方法已经实现了,那么可以使用“方法引用” 也可以理解为方法引用是lambda表达式的另外一种表现形式并且其语法比lambda表达式更加简单 - 对象::实例方法名 ``` Consumer<Object> co = x -> System.out.println(x); // 参数列表及返回类型与调用方法列表一致。 // 上例可以直接写成 Consumer<Object> co2 = System.out::println; ``` - 类名::实例方法名 ``` BiFunction<String,String,Boolean> bi = (x1, x2) -> x1.equals(x2); // 传入的第一个参数表示实例对象,之后的参数列表及返回类型与调用方法一致。 // 上例可以直接写成 BiFunction<String,String,Boolean> bi2 = String::equals; ``` - 类名::静态方法名 ``` BiFunction<Integer,Integer,Integer> f = (x1, x2) -> Integer.compare(x1, x2); // 参数列表及返回类型与调用方法列表一致。 // 上例可以直接写成 BiFunction<Integer,Integer,Integer> f2 = Integer::compare; ``` - 对象的创建 ``` // 无参构造 Supplier<String> sup = () -> new String(); // 上例可写为 Supplier<String> sup1 = String::new; // 有一参数的构造器 Function<String, String> f = x -> new String(x); // 上例可写为 Function<String, String> f2 = String::new; ``` - 数组的创建 ``` Function<Integer, Integer[]> f = x -> new Integer[x]; // 上例可写为 Function<Integer, Integer[]> f2 = Integer[]::new; ``` ***** 原文链接:https://blog.csdn.net/qq_29411737/article/details/80835658