当前位置:   article > 正文

java 8学习总结_java8 学习

java8 学习

学习目标:

  • 掌握 Java 8新增类库,类库升级背景,使用场景等。
  • 掌握流处理、函数式编程,知其所以然,并能熟练应用到日常开发中。

学习途径:

  • 《Java8实战》

学习内容:

  • java 8新增类库基本概念
  • Lambda表达式
    ()->,这样写法的便是Lambda表达式,相当于一个匿名类的替代写法,他的类型由上下文编译时确认。
  • 方法引用
    Person::getName,这样的写法便是,可读性更好,表达更清晰。

  • 流是从支持数据处理操作的源生成的元素序列。
  • 默认方法
    在接口中申明了默认方法,就可以在接口中为方法写实现,并行在实现类中可以不必强制要求实现这个方法,这样是为了保证接口在做升级时,能向前兼容,不需要以前已经实现了的类再去实现这个方法。
  • 行为参数化
    即一个方法接受一个行为作为它的参数,这个行为我们可以是一些计算、变量处理、或者日志打印等,这样我们就可以不用每次都去申明一个方法来封装一些计算,或者使用匿名类这样的复杂写法。
  • 函数式数据处理
  • 流与集合的异同
    要理解流的概念,可以跟集合做一个对比,流与集合的区别在于,集合讲的是数据,流讲的是计算,集合是内存中的数据结构,它包含了数据结构中目前所有的值。而流是按需创建的,只有你有计算需求时,才从数据源中获取值,集合就可以作为流的数据源。集合必须是有穷的,而流可以是无穷的。
  • 流操作:
    筛选、切片、查找、匹配、映射、归约
    流支持两种类型的操作:中间操作(如filter或map)和终端操作(如count、findFirst、forEach和reduce),中间操作用于计算,将一个流转换成另一个流,并不会有数据输出,只有终端操作时流才会输出数据。
  • 收集器
    collect收集器,支持计算最大值、最小值、groupingBy分组、多级分组等,也可以自定义收集器。
  • 并行流
    parallelStream,使用的是java自带分之合并框架内置的线程池,默认的线程数是你的CPU内核数。
  • 高效java8编程
  • java8替代一些设计模式
    可以用java8提升代码的可读性和灵活性,比如替换匿名类、修改集合迭代,替代一些设计模式:策略、模板、观察者、责任链等模式,当然并不能完全替代他们的功能,只能替换少部分使用较为简单的场景。
  • 默认方法
    默认方法帮助类库设计者以后向兼容的方式演进API,在做接口更新时不需要考虑历史实现类的继承继承问题。并且能帮我们做到行为多继承和可选方法。
  • Optional类代替null值
    null值作为最开始设计用来表达缺失的值一种方式,最终证明是有缺陷的,因为会需要我们再编程中针对值缺失做大量的检查,否则你就会收到NullPointException。使用Optional类对存在或缺失的变量值建模,能有效避免漏掉null值检查导致的异常。
  • CompletableFuture异步编程
    异步化帮助我们更好地使用多核CPU的处理能力,并且相比线程池和parallelStream来说,在编程上更具有灵活性,可以处理异常,也可以根据情况处理回调时间。
  • 新的Date和Time接口
    以前的Date由于设计原因,使用复杂,经过java版本不断升级后很多方法被废弃,后来Calendar类并不能完全替代Date类,并且自身也有一些设计问题,比如月份依旧是从0开始计算。其次DateFormat类只适用于Date类,且是线程不安全的。
  • 超越java8
  • 函数式编程
    什么是函数式编程呢?我们先按字面意义是上理解,就是用函数的方式编程的一种思想。这里函数的概念是我们希望如同数学函数一样,同样的输入,始终能有不变的输出,我们也称为引用透明性。通过输入和输出就能判断一个方法是不是“函数式”的。引入函数式编程,目的是为了减少因为修改外部引用,导致的维护&调试困难,提高我们代码的可维护性。
  • 函数式编程的高级技术
    一等函数:可以作为参数传入,也可作为结果返回,也可保存到数据结构中的函数。
    高阶函数:接收至少一个函数作为参数,或者返回另一个函数的函数。
    科里化:将f(x,y)转变成(g(x))(y),通过拆分函数入参,帮助我们模块化代码和重用代码的方法。
    延迟列表:需要计算时,才创建列表中的元素。
    模式匹配:可以理解为switch-case的一种泛化及增强,可以匹配多种自定义类型等。
    针对引用透明性的函数,因为输入及输出保持不变的映射关系,可以对其值进行缓存,可以使用Map接口的computeIfAbsent方法简化缓存的读写操作。
    结合器:是一种函数式编程的思想,指将两个或多个函数或者数据结构进行合并。
  • Java8和Scala特性比较
    Java8和Scala都是同时具有面向对象编程及函数式编程的特性的语言。
    两者同样都支持对集合List、Set等的操作,不过Scala增加了元组(Tuple)。
    Scala为函数式编程提供了更多的支持,比如访问本地变量的闭包、内置的科里化表单。
    Scala语言提供隐式的构造器、getter、setter方法。
    Scala支持trait,是一种包含字段和默认方法的接口,可以理解为结合了Java的接口及抽象类的特性。
  • 回顾与展望
    Java8的更新不是无的放矢,而是基于多核硬件的运行环境需求,及针对集合的处理需求,而进行的针对函数式编程、并发等的更多支持更新。函数式编程由于其引用透明性,能更好地支持并发操作。
    用流替代集合的一些处理,因其延迟加载的特性,并且能将多个运算进行组合,多次遍历降低为一次遍历,能极大地提升处理速度,并且降低内存消耗。

Q&A:

  • 为什么学习java8?

因为在开发过程中会大量的使用for循环等处理集合,繁琐且可读性差,流和函数式编程很明显能帮我们解决这个问题。但是在使用过程中,由于不清楚其中原理,很多时候不知道该如何去优化我们的代码,不知道map什么时候用、collect都有些什么工具,无法做到手到擒来。

  • 为什么java8是java版本升级过程中的一个重要版本

个人认为两个方面,一个是流和函数式编程,一个方面是jvm垃圾回收算法的升级,这两个部分是主要原因,前者对我们的开发影响更甚。

  • DateFormat如何线程不安全,会有什么影响?
  • Optional类能解决null值的问题吗

我的回答是不能的,至少是不能彻底解决,从Optional类的设计上来看,只是帮助我们从方法签名上就能看出是否需要我们去做null值检查,在方法设计上,只能解应用Optional才能取到值,相当于强制提醒我们做了null值检查,在编程上来说认为是增加复杂度了的,所以目前你可以看到大家用的还是不多,也没有刻意地使用来避免null检查。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/325583
推荐阅读
相关标签
  

闽ICP备14008679号