JAVA8新特性Lambda & Stream &Optional

Java8新特性之Lambda表达式(本文由同事整理,本人仅做记录学习)

Lambda是Java8的新特性之一,但不是java独有的。是一种函数式编程思想。

  • 表达式形式

(parameters)-> expression

  1. -> 左侧:方法需要的参数,可以无参数(),也可以多参数(xx,xx)多参数间以“,”相隔。
  2. –> 右侧:方法所需要执行的逻辑方法。
  3. 例:JAVA8新特性Lambda & Stream &Optional_第1张图片
  • 环境要求

安装Java8

  • 好处
  1. 代码简单
  2. 允许传递行为,Java8前传递行为唯一方式是使用匿名内部类。

例:JAVA8新特性Lambda & Stream &Optional_第2张图片

JAVA8新特性Lambda & Stream &Optional_第3张图片

 

 

  1. 性能较好。
  2. 在Lambda表达式中,我们不需要明确指出参数类型,javac编译器会通过上下文自动推断参数的类型。
  • 深入理解Lambda表达式
  1. Lambda表达式的类型是一种接口。

JAVA8新特性Lambda & Stream &Optional_第4张图片

JAVA8新特性Lambda & Stream &Optional_第5张图片

JAVA8新特性Lambda & Stream &Optional_第6张图片

 

  1. 实现Lambda接口的特点
  1. 只有那些仅仅包含一个非实例化抽象方法的接口才能使用Lambda表达式,这种接口称为函数式接口,并且能够被@FunctionalInterface注解注释。
  2. Consumer和Comparator接口中出现的default方法

这也是Java8出现的新功能,被default修饰的方法为非抽象方法,且只能在接口中使用,可以直接在接口中写方法体。

     3.Comparator接口中的equals方法

从Object继承的方法。

  • Java8中带有的常用函数接口
  1. Java.util.function.Predicate
  1. 功能:检查条件
  2. 内部方法:test
  3. 示例:JAVA8新特性Lambda & Stream &Optional_第7张图片

  1. Java.util.function.Function
  1. 功能:需要一个参数返回一个结果,T是参数,R是结果
  2. 内部方法:apply

JAVA8新特性Lambda & Stream &Optional_第8张图片

 

compose:先执行before函数的apply方法,再将结果传入当前函数的apply方法

andThen:先执行当前函数的apply方法,再将该结果传入after函数对象apply方法。

identity:输入是什么参数输出就是什么参数。

  1. 示例:

JAVA8新特性Lambda & Stream &Optional_第9张图片

  1. Java.util.function.Consumer
  1. 功能:需要一个参数但没有返回值
  2. 内部方法:accept
  3. 示例:同上
  1. Java.util.function.Supplier
  1. 功能:不需要参数,但是会返回一个值
  2. 示例:

 

 

Java8新特性之Stream表达式

Stream是对集合更高级的抽象,通常和Lambda一起使用。

  • 示例

JAVA8新特性Lambda & Stream &Optional_第10张图片

  • Stream操作

分为两种:过渡操作,终极操作

过渡操作:从已存在的stream上产生另一个新的stream

终极操作:从stream上产生结果函数。

常用的Stream API如下:

  1. stream():

创建一个stream管道

  1. filter(Predicate)

用来提取匹配predicate定义规则的元素

  1. sorted(Comparator)

用来按照Comparator定义的规则来排序

  1. map(Function)

返回一个stream,该stream中的元素来自原stream中每个元素通过Function处理后得到的结果

  1. limit(int)

将结果集合限定在给定的数字,是一个短路操作,不会为了得到结果而运算所有元素。

  1. distinct()

去重操作

  1. count()

终极操作,得到数量

  1. collect(Collectors.xxx)

终极操作,toList将结果装在list中

  1. flatMap
  2. JAVA8新特性Lambda & Stream &Optional_第11张图片

将各个stream合成到一个stream

  1. allMatch(Predicate),anyMatch(Predicate),noneMatch(Predicate)

终极操作,判断是否满足Predicate中的条件,返回boolean

  1. reduce

终极操作,连接stream中所有元素,返回Optional

  1. 基本类型及数组创建stream操作
  1. 对int,long,double等基本类型提供特定stream

JAVA8新特性Lambda & Stream &Optional_第12张图片

  1. 数组创建stream

  1. min(Comparator),max(Comparator),findFirst(),findAny()

终极操作,返回Optional

  1. findFirst()取得集合第一个对象。
  2. findAny()取得集合任何一个对象。

在串行流中,findFirst和findAny返回都是第一个对象;

在并行流中,findAny返回的是最快处理完的那个线程数据。

关于Optional见第三部分

JAVA8新特性Lambda & Stream &Optional_第13张图片

  1. parallel()

parallel使stream处于并行,即在多个线程中进行运算。

JAVA8新特性Lambda & Stream &Optional_第14张图片

boxed():将IntStream转为Stream

 

 

 

Optional类

Optional类也是Java8引入的新特性,主要解决的问题是空指针异常(NullPointerException),意味着Optional类即可以含有对象也可以为空。

  • Optional提供的方法

JAVA8新特性Lambda & Stream &Optional_第15张图片

  1. orElse(xxxx)

如果创建的Optional中有值存在则返回该值,没值则返回设置的默认值xxxx

  1. orElseGet(() -> xxxxx)

如果创建的Optional中有值则返回该值,没值则返回Supplier接口生成的值

JAVA8新特性Lambda & Stream &Optional_第16张图片

由结果看性能比ofElse更好。

  1. map(Function(T,R)) && flatMap(Function(T,Optional))

map:返回值被自动包装成Optional类型

flatMap:Function方法的返回值一定要是Optional

JAVA8新特性Lambda & Stream &Optional_第17张图片

  1. isPresent && ifPresent(Consumer(T))

isPresent:是判断存不存在,返回boolen

ifPresent:如果创建的Optional存在,则通过consumer接口进行处理,没有返回值。

 

你可能感兴趣的:(Java基础)