JDK8特性总结——lambda表达式,Stream流,方法引用,LocalDateTime

JDK8特性总结

Lambda表达式

  • lambda表达式的作用就是简化了匿名内部类的写法
  • 使用它的前提条件是接口中有且仅有一个抽象方法
  • lambda表达式的标准格式是(方法参数) -> {方法体},也还有一些省略的写法:
    • 方法参数中的参数类型可省略
    • 如果方法参数中只有一个参数,那么小括号也可以省略
    • 对于有返回值的方法,方法体中如果只有一条语句,大括号、return关键字和返回语句结尾的分号也可以省略
  • lambda表达式和匿名内部类的区别:
    • lambda表达式只能用于接口,而匿名内部类可以用于抽象类、接口
    • lambda表达式中接口有且仅有一个抽象方法,而匿名内部类对抽象方法的数量没有限制
  • 在接口中使用@FunctionalInterface注解来标记接口是一个函数式接口,接口中有且仅有一个抽象方法

接口增强

  • jdk8之前接口中只能有静态常量和抽象方法
  • jdk8允许接口中存在默认方法和静态方法,新增这两个方法的目的就是为了接口的扩展性,因为我如果现在想往一个接口中新增方法,那么该接口的所有实现类都需要重写新增的方法,十分麻烦,如果接口中新增默认方法和静态方法那么实现类也就不需要重写了。
  • 默认方法,接口的实现类可以选择要不要重写新增的默认方法,也可以不重写。默认方法需要对象来调用
  • 静态方法,它只能使用接口名来调用,不能使用对象来调用

常见函数式接口

  • jdk为我们提供很多的函数式接口的目的是:我们使用lambda表达式的前提是接口必须是函数式接口,那么我们每一次使用都需要去创建这样一个接口,为了避免这种情况,jdk8的时候为了提供了很多常见的函数式接口。当然,一些特殊的场景还是需要自己去创建接口,
  • lambda表达式不关心接口名和抽象方法名,只关心方法参数和返回值。
  • 接下来举例一些常见的函数式接口:
    • Consumer接口:典型的消费者接口,该接口有一个参数,没有返回值
    • Supplier接口: 提供者接口,该接口无参,但有返回值
    • Function接口:有参数有返回值
    • Predicate接口:有参数,并且返回值是一个boolean类型

方法引用

  • 目的:lambda表达式的出现是减少匿名内部类的冗余代码,但是有一些场景下lambda表达式中方法体中的代码也很多,并且具体方法的业务逻辑和其他方法一样,为了减少lambda表达式的冗余代码,就可以采用方法引用
  • 方法引用的前提是,接口中抽象方法的参数和返回值必须要和被引用方法一致
  • 方法引用的几种方式如下:
    • 实例对象::普通方法
    • 类名::静态方法
    • 类名::普通方法 这种方式其实就是拿方法的第一个参数作为方法的调用者
    • 类名::构造方法 这种方式的另一种写法是 类名::new
    • 数组::构造方法

Steam流

  • Stream流出现的目的是:提高对集合数据的处理的性能以及便利。

  • 获取Stream流的方式:

    • Collection接口中的默认方法stream(),可以让list集合和set集合直接调用该方法获取到stream流
    • map集合需要先转换为set集合,然后再调用stream()方法
    • 如果是数组,需要调用Stream接口中的静态方法of(),
  • Stream的常用方法:count() 、foreach() 、filter() 、limit() 、skip() 、map() 、concat()

  • stream注意事项:

    • stream只能操作一次
    • stream方法返回的是最新的流
    • stream不调用终结方法,中间的操作不会执行,终结方法就是count() 和 foreach()两个方法
  • 常用方法:

    • count() 计数
    • foreach() 遍历
    • filter() 过滤
    • map() 类型转换
    • limit() 取前几个元素
    • skip() 跳过前几个元素
    • concat() 组合
    • sorted() 排序
    • distinct() 去重
    • mapToInt() 包装类转换为基本类型
    • reduce() 归纳
    • collect() 数据收集,其中有收集到集合、数组;分组;聚合;分区;拼接等操作
  • 串行流

    • 获取方式:调用Collection接口中的默认静态方法parallelStream() 或者将串行流转换为并行流parallel()

    • 线程安全问题:加同步锁或使用线程安全的集合

  • Fork/Join框架

    • 核心原理——分治法
    • 核心原理——任务窃取

Optional

  • 创建Optional对象的方式:调用Optional.of() Optional.ofNullable() Optional.empty()
  • 常用方法
    • get()
    • isPresont()
    • ifPresont()
    • orElse()
    • orElseGet()
    • map

日期时间

  • JDK1.8 提供新的日期时间对象为LocalDate LocalTime LocalDateTime

  • 对象的创建方法:now() of()

  • 日期时间对象的修改: withXXXX() plusXXX() minusXXXX()

  • 日期对象的比较:isAfter() isBefore()

  • 格式化与解析localDateTime.format(DateTimeFormatter d) LocalDateTime.parse("XXX", DateTimeFormatter d)

  • 日期时间的差:Duration Period

  • 时区 ZonedDateTime

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值