1.Lambda表达式
>语法
左侧: 指定了Lambda表达式需要的参数列表
右侧: 制定了Lambda体,是抽象方法的实现逻辑,即Lambda表达式要执行的功能
>语法格式
1)无参,无返回值
2)需要一个参数,但没有返回值
3)数据类型可以省略
4)Lambda若只需要传入一个参数时,参数的小括号可以省略
5)Lambda若需要传入两个或以上的参数,多条执行语句,并且可以有返回值
6)但Lambda体只有一条语句时,return与大括号若有,都可以省略
2.函数式接口
>什么是函数式接口?
• 只包含一个抽象方法(Single Abstract Method,简称 SAM)的接口,称为函数式接
口。当然该接口可以包含其他非抽象方法。
• 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受
检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。
•
我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是
否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数
式接口。
• 在 java.util.function 包下定义了 Java 8 的丰富的函数式接口
>如何理解函数式接口?
• 面向对象的思想:
做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情。
• 函数式编程思想:只要能获取到结果,谁去做的,怎么做的都不重要,重视的是结果,不重
视过程。
• 在函数式编程语言当中,函数被当做一等公民对待。在将函数作为一等公民的编程语
言中,Lambda 表达式的类型是函数。但是在 Java8 中,有所不同。在 Java8 中,
Lambda 表达式是对象,而不是函数,它们必须依附于一类特别的对象类型------函数
式接口。
• 简单的说,在 Java8 中,Lambda 表达式就是一个函数式接口的实例。这就是 Lambda
表达式和函数式接口的关系。也就是说,只要一个对象是函数式接口的实例,那么该
对象就可以用 Lambda 表达式来表示。
>举例

>四大核心函数式接口
1)消费型接口 Consumer<T> 对类型为T的对象应用操作,包含方法: void accept(T t)
消费型接口的特点: 有形参,但是返回值类型是void

2)供给型接口 Supplier<T> 返回类型为T的对象,包含方法: T get()
供给型接口的特点; 无参,但是有返回值

3)函数型接口 Function<T,R> 对类型为T的对象应用操作,并返回结果,结果类型时R类型的对象,包含方法: R apply(T t)
函数型接口的特点: 既有参数又有返回值


4)判断型接口 Predicate<T> 确定类型为T的对象是否满足约束,并返回boolean值,包含方法: boolean test(T t)
判断型接口的特点: 有参,但是返回值类型是boolean型


3.Stream API
>说明
• Stream API ( java.util.stream) 把真正的函数式编程风格引入到 Java 中。这是目前为止
对 Java 类库 最好的补充 ,因为 Stream API 可以极大提供 Java 程序员的生产力,让程
序员写出高效率、干净、简洁的代码。
• Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操
作,可以执行非常复杂的查找、过滤和映射数据等操作。 使用 Stream API 对集合
数据进行操作,就类似于使用 SQL 执行的数据库查询。 也可以使用 Stream API 来
并行执行操作。简言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
>Stream操作的三个步骤
1)创建Stream
一个数据源(如集合,数组),获取一个流
2)中间操作
每次处理都会返回一个持有结果的新Stream,即中间操作的方法返回值仍然是Stream类型的对象,因此中间操作可以是一个操作链,可以对数据源的数据进行n次处理,但是在终止操作前,并不会真正执行
3)终止操作
终止操作的方法返回值就不再是Stream了,因此一旦执行终止操作,就结束真个Stream操作了,一旦执行终止操作,就执行中间操作链,最终产生结果并结束Stream

>一系列中间操作




