Java8学习笔记 - 在哪里可以使用Lambda表达式 + 什么是函数式接口

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8学习笔记 - 在哪里可以使用Lambda表达式 + 什么是函数式接口相关的知识,希望对你有一定的参考价值。

1. 定义

  1. 你可以在函数式接口上使用Lambda表达式。也可以将它作为变量传递。
    1.1. Lambda表达式可以赋给一个变量 (类型为:函数式接口)
    1.2. Lambda表达式可以传递给一个接受函数式接口作为参数的方法
  2. 函数式接口就是只定义了一个抽象方法的接口。
    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中的常用函数式接口

函数式接口函数声明针对基础类型的优化版
PredicateT->booleanIntPredicate
LongPredicate
DoublePredicate
ConsumerT->voidIntConsumer
LongConsumer
DoubleConsumer
Function<T,R>T->RIntFunction
IntToDoubleFunction
IntToLongFunction
LongFunction
LongToDoubleFunction
LongToIntFunction
DoubleFunction
ToIntFunction
ToDoubleFunction
ToLongFunction
Supplier()->TBooleanSupplier
IntSupplier
LongSupplier
DoubleSupplier
UnaryOperatorT->TIntUnaryOperator
LongUnaryOperator
DoubleUnaryOperator
BinaryOperator(T,T)->TIntBinaryOperator
LongBinaryOperator
DoubleBinaryOperator
BiPredicate<L,R>(L,R)->boolean
BiConsumer<T,U>(T,U)->voidObjIntConsumer
ObjLongConsumer
ObjDoubleConsumer
BiFunction<T,U,R>(T,U)->RToIntBiFunction<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 * bIntBinaryOperator
比较两个对象(Ap a1, Ap a2) -> a1.getWeight().compareTo(a2.getWeight())Comparator<Apple>
BiFunction<Apple, Apple, Integer>
ToIntBiFunction<Apple, Apple>

4. 参考资料

Java8自带的一些函数式接口

以上是关于Java8学习笔记 - 在哪里可以使用Lambda表达式 + 什么是函数式接口的主要内容,如果未能解决你的问题,请参考以下文章

Java重温学习笔记,Java8新特性:Java Lambda 表达式

Java8学习笔记 - 方法引用:Lambda的语法糖

Java8学习笔记 - 方法引用:Lambda的语法糖

Java8学习笔记

Java学习笔记之三十一详解Java8 lambda表达式

Java8新特性学习笔记 Lambda表达式