Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包,和传统数学上的意义有区别。
如何使用 Lambda 表达式
平时我们使用来创建匿名内部类来实现Runnable接口
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
如果我们使用Lambda 表达式
就可以简写为如下代码
Runnable runnable1 = () ->{
System.out.println(Thread.currentThread().getName());
};
()-> 左边的作为变量,右边所代表为匿名内部内部类,如果只有一行代码,就可以省略代码
函数式接口: 有且仅有一个抽象方法的接口。
Java中的函数式编程体现就是Lambda表达式。
所以函数式接口即可以适用于Lambda使用的接口。
你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda
表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方
法上进行声明).
这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包
含一条声明,说明这个接口是一个函数式接口。
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
⚫对象::实例方法名
⚫类::静态方法名
⚫类::实例方法名
与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,与构造器参数列表要与接口中抽象方法的参数列表一致!
格式:ClassName::new
Stream是Java 8中引入的全新API,可以极大地方便我们对集合、数组等数据源进行连续操作。它可以简化我们的代码,使代码更加易于维护和理解。Stream实际上是一种惰性计算的方式,只有需要输出结果时,才会开始计算。
创建stream :获取一个集合获取stream
stream操作: 对stream 进行不同的操作
结束stream流: 终止stream流的操作,将他的元素进行打印,或者收集
我可以通过以下方法创建stream流
default Stream<E> stream():返回一个顺序流
default Stream<E>parallelStream():返回一个并行流
Java8中的Arrays的静态方法stream()可以获取数组流
static<T>Stream<T>stream(T[]array):返回一个流
public static IntStream stream(int[]array)
public static LongStream stream(long[]array)
public static DoubleStream stream(double[]array)
由值创建流
public static<T>Stream<T>of(T...values): 返回一个流
由函数创建流:创建无限流
public static<T> Stream<T> iterate(final Tseed,final UnaryOperator<T>f) 生成
public static<T> Stream<T> generate(Supplier<T> s):
个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”。
方法 | 描述 |
---|---|
filter(Predicatep | 接收Lambda,从流中排除某些元素。 |
distinct() | 筛选,通过流所生成元素的hashCode()和equals()去除重复元素 |
limit(longmaxSize) | 截断流,使其元素不超过给定数量。 |
skip(longn) | 跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补 |
map(Functionf) | 接收一个函数作为参数,该函数会被应用到每个元 |
mapToDouble(ToDoubleFunctionf) | 素上,并将其映射成一个新的元素。接收一个函数作为参数,该函数会被应用到每个元 |
flatMap(Functionf) | 素上,产生一个新的DoubleStream。接收一个函数作为参数,将流中的每个值都换成另 |
终端操作会从流的流水线生成结果。其结果可以是任何不是流的
值,例如:List、Integer,甚至是void 。
方法 | 描述 |
---|---|
count() | 返回流中元素总数 |
forEach(Consumerc | 迭代元素 |
reduce(T iden, BinaryOperatorb) | 可以将流中元素反复结合起来,得到一个值。 |
reduce(BinaryOperatorb) | 可以将流中元素反复结合起来,得到一个值。 |
collect(Collectorc) | 将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法实现 |
Collector接口中方法的实现决定了如何对流执行收集操作(如收集到List、Set、Map)。但是Collectors实用类提供了很多静态方法,可以方便地创建常见收集器实例,具体方法与实例如下表:
使用LocalDate、LocalTime、LocalDateTime
例是不可变的对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。