Java8学习笔记 - 在哪里可以使用Lambda表达式 + 什么是函数式接口
Posted 笑虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8学习笔记 - 在哪里可以使用Lambda表达式 + 什么是函数式接口相关的知识,希望对你有一定的参考价值。
Java8学习笔记 - 在哪里可以使用Lambda表达式 + 什么是函数式接口
1. 定义
- 你可以在函数式接口上使用Lambda表达式。也可以将它作为变量传递。
1.1. Lambda表达式可以赋给一个变量 (类型为:函数式接口)
1.2. Lambda表达式可以传递给一个接受函数式接口作为参数的方法 - 函数式接口就是只定义了一个抽象方法的接口。
2.1. 我们可以粗略的将函数式接口
中的那个抽象方法
,理解成Lambda
表达式的函数声明
(函数描
述符)。至此Lambda要接收几个参数,返回什么类型就都明了了。
2.2. 至于为什么只能是一个抽象方法
。很简单嘛,直接看2.2。你要是接口里有两方式,鬼知道用哪个?
2. 举例
2.1 定义一个函数式接口。
@FunctionalInterface
不强制,但建议加上。它表示这是一个函数式接口。类似于用@Override
来标示重写。
@FunctionalInterface
public interface NameFormat{
String format(String str);
}
2.2 定义接收函数式接口
类型参数的方法
定义一个方法,它可以接收函数式接口
类型的参数
public void showName(String name, NameFormat f){
System.out.println(f.format(name));
}
2.3 调用
调用时,我们可以根据需要,将格式化的逻辑代码以Lambda表达式
的形式传进来。
Hero hero = new Hero();
hero.showName("笨笨", name -> "耀眼的" + name);
Hero hero = new Hero();
NameFormat nf = name -> "最最最爱你的" + name;
hero.showName("笨笨", nf);
3. Java8自带的一些函数式接口
大多数情况直接用就行了,实在无法满足需求,还可以自定义嘛。
3.1. Java8实战 —— 表3-2 Java 8中的常用函数式接口
函数式接口 | 函数声明 | 针对基础类型的优化版 |
---|---|---|
Predicate | T->boolean | IntPredicate LongPredicate DoublePredicate |
Consumer | T->void | IntConsumer LongConsumer DoubleConsumer |
Function<T,R> | T->R | IntFunction IntToDoubleFunction IntToLongFunction LongFunction LongToDoubleFunction LongToIntFunction DoubleFunction ToIntFunction ToDoubleFunction ToLongFunction |
Supplier | ()->T | BooleanSupplier IntSupplier LongSupplier DoubleSupplier |
UnaryOperator | T->T | IntUnaryOperator LongUnaryOperator DoubleUnaryOperator |
BinaryOperator | (T,T)->T | IntBinaryOperator LongBinaryOperator DoubleBinaryOperator |
BiPredicate<L,R> | (L,R)->boolean | |
BiConsumer<T,U> | (T,U)->void | ObjIntConsumer ObjLongConsumer ObjDoubleConsumer |
BiFunction<T,U,R> | (T,U)->R | ToIntBiFunction<T,U> ToLongBiFunction<T,U> ToDoubleBiFunction<T,U> |
3.2. Java8实战 —— 表3-3 Lambdas及函数式接口的例子
使用案例 | Lambda 例子 | 对应的函数式接口 |
---|---|---|
布尔表达式 | (List<String> list) -> list.isEmpty() | Predicate<List<String>> |
创建对象 | () -> new Apple(10) | Supplier<Apple> |
消费一个对象 | (Apple a) -> System.out.println(a.getWeight()) | Consumer<Apple> |
从对象获取属性 | (String s) -> s.length() | Function<String, Integer> 或 ToIntFunction<String> |
合并两个值 | (int a, int b) -> a * b | IntBinaryOperator |
比较两个对象 | (Ap a1, Ap a2) -> a1.getWeight().compareTo(a2.getWeight()) | Comparator<Apple> 或 BiFunction<Apple, Apple, Integer> 或 ToIntBiFunction<Apple, Apple> |
4. 参考资料
以上是关于Java8学习笔记 - 在哪里可以使用Lambda表达式 + 什么是函数式接口的主要内容,如果未能解决你的问题,请参考以下文章