【Java8 新特性】笔记

Lambda表达式

Lambda 是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码。使用它可以写出更简介、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升

lambda表达式的本质就是作为函数式接口的实例
以前用匿名实现类表示的现在都可以用Lambda表达式来写

Funcational 函数式接口

  • 只包含一个抽象方法的接口,称为函数式接口
  • 你可以通过Lambda表达式来创建该接口的对象
  • 我们可以在一个接口上使用@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口

面向对象OOP
面向函数式OOF

Java内置的四大函数式接口

  • Consumer void accept(T t) 消费型接口
  • Supplier T get() 共给型接口
  • Function<T,R> R apply(T t) 函数型接口
  • Predicate boolean test(T t) 断定型接口

方法引用与构造器引用

  • 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用
  • 方法应用可以看作是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可认为是Lambda表达式的一个语法糖
  • 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致
  • 格式:使用::操作符将类与方法分隔开

方法引用的三种方式

  • 对象::非静态方法名
  • 类::静态方法名
  • 类::非静态方法名

方法引用使用的要求
要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同


//情况一: 对象::实例方法
Consumer中的void accept(T t)
PrintStream中的void println(T t)

//情况二: 类::静态方法
Comparator中的int compare(T t1,T t2)
Integer中的int compare(T t1,T t2)

//情况三: 类::实例方法
Comparator中的int compare(T t1,T t2)
String中的int t1.compare(t2)

Function中的R apply(T t)
Employee中的String getName()

Stream API

Java8中有两个最为重要的改变。第一个是Lambda表达式;另一个是Stream API

Stream API把真正的函数式编程风格引入到Java中。这是目前为止对Java类库最好的补充

使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询

Sream是数据渠道,用于操作数据源(集合,数组)所生成的元素序列

注意
Stream自己不会存储元素
Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream
Stream操作时延迟执行的。这意味着他们会等到需要的结果的时候才会执行

Stream的三类操作
创建操作
中间操作,多个
终止操作


通过集合创建Stream
list.stream()	返回一个顺序流
list.parallelStream()	返回一个并行流

通过数组创建Stream
Arrays.stream(array)

通过stream的of方法创建Stream
Stream.of(1,2,3)

迭代
Stream.iterate(0,t->t+2).limit(10).forEach

生成
Stream.generate(Math::random).limit(10).forEach

filter	接收lamdba,从流中排除某些元素
limit	截断流,使其元素不超过给定数量
skip	跳过元素
distinct	筛选,去重
map
mapToDouble
mapToInt
mapToLong
flatMap
sorted
allMatch	检查是否匹配所有元素
anyMatch	检查是否至少匹配一个元素
noneMatch	检查是否没有匹配所有元素
findFirst	返回第一个元素
findAny	返回当前流中的任意元素
count	返回流中元素的总个数
max	返回流中最大值
min	返回流中最小值
forEach	迭代
reduce	可以将流中元素反复结合起来,得到一个值
collect	将流转换为其他形式,接收一个Collector接口的实现,用于给Stream中元素做汇总的方法

Optional 类

Optional 类是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用null表示一个值不存在,现在Optional 可以更好的表达这个概念。并且可以避免空指针异常


Optional.of(T t)	创建一个Optional实例,t必须非空
Optional.empty()	创建一个空的Optional实例
Optional.ofNullable(T t)	t可以为null
isPresent()	判断是否包含对象
isPresent(Consumer<? super T> consumer)	如果有值,就执行参数接口
get()	如果调用对象包含值,返回该值,否则异常
orElse(T other)	如果有值则将其返回,否则返回指定的other对象
orElseGet(Supplier<? extends T> other)	如果有值则将其返回,否则返回参数接口实现的对象
orElseGet(Supplier<? extends X> exceptionSupplier)	如果有值则将其返回,否则抛出Supplier接口实现提供的异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值