一个语言要想一直有活力,它也需要跟随着时代的变化去进步,Java作为一个古老的语言,它其实有太多的历史包袱,在改变的过程中需要考虑很多,但是它也在慢慢的演变,巩固自己的城墙,不让自己被遗忘在历史中(不少的编程语言已经随着时间的推移,消失在人们的视线中)。当然,作为一个拿Java语言当成主语言的程序员,它的进步其实也在延长我们的职业生涯。

  Java8带来了很多新的特性,虽然Java8发布已经很久了,但是一直没有系统的学习,所以这部分一直没有进行总结。前东家考虑到与之前系统的兼容,技术标准将JDK7作为开发工具,这样也无法利用Java8带来的新特性。其实Java作为一个广泛应用的语言来说,它自己的发布周期已经考虑了向前兼容,所以即使升级了JDK版本,其实也不会带来太大的困扰,追随最新的技术,让员工能够学习到新的技术标准,其实也是让员工更加稳定的一种策略,同时在解决问题的同时,既得到了锻炼,同时也获得了成就感。这点也很重要。

函数

  1. Java8 Lambda的引入可以说是一种非常重要的特性,可以说Java中新增了一种值的属性,这种值的类型是函数(这种特性在其他语言当中很早的就支持了,Java其实已经有些慢动作了)。

所以当你想要

  • 排序一个Collection
  • 声明一个Thread
  • ...

已经不需要去实现一个匿名类了,匿名类太多的无用代码,直接传递Lambda函数更加简洁,易读。

Lambda声明方式(arg1, arg2,...) -> {statement} ,其中单句的return expression;可以简写为(arg1, arg2,...) -> expression

  1. Java还引入了一种引用已有方法的语法糖,这个特性称为方法引用,可以进一步的简化代码。
  • 静态方法引用

  • 指向任意类型实例方法引用

  • 指向现有对象实例的方法引用

  1. 现在已经有传入的参数了,但是如果声明一个函数的参数为lambda类型该如何声明,此时就需要使用函数接口了,lambda的类型在Java中是以函数接口实现的,函数接口是有且仅有一个抽象方法的接口,Java中已经提供了部分可以直接使用的函数接口,当不满足需求时我们在声明自己的函数接口即可。

Stream

Stream的强大在于它可以让你以声明性的方式处理数据集,同时,如果数据处理过程中数据处理过程,处理器以及收集器(这些后面会介绍)没有副作用(函数式编程思想里的一个概念),Stream可以很简单,方便的利用多核架构的优势,自动的并行执行。所以它的两个强大优点:声明式数据处理,自动的并行执行。让我们看看这两个Stream的优势,当你熟练使用,一定会对它爱不释手的。

如果你了解RxJava背后的思想,其实这个和RxJava使用非常相似,当然RxJava功能比Stream要强大一些,但是思考的时候也是利用这种图形来思考数据处理,RxJava是简化异步编程的一种模型,如果不了解可以去学习一下,很方便的一个工具。这里多扯一句,现在高并发的环境下,对异步的需求越来越多,这样在IO密集的场景下节省资源,可以支持高并发,但是异步编程一个缺点就是不符合人们的思考习惯,所以写起来很复杂。RxJava的思想一定程序上减少了这种不方便。

但是新进的语言Go就从另外一种角度解决了这个问题,它在runtime支持协程的概念,你可以理解协程就是可以共享一个线程的几个程序块,由程序员去管理协程之间的切换。这个好处是充分利用了线程,并且可以容忍用户以同步的模型去编写代码,解决了异步编程中不符合人们思考的习惯。当然这只是我粗鄙的理解,Go语言是值得学习的语言,可以拿来作为一个备选语言学习。

Steam上的操作可以分为两大类操作

  • 中间操作

  • 终端操作

Stream上有一个非常好用的终端操作,它就是收集器。Java中提供了一些预定义的收集器,这些收集器均通过Collector类提供的工厂方法创建,按照功能分类如下。

  • 将流元素归约和汇总为一个值
  • 元素分组
  • 元素分区

Stream的并行数据处理这部分暂时不提,其中涉及到并行流底层的实现,而且还有如何自定义的分割流,需要明白其原理才能正确的使用。这里暂时先记住Stream可以透明的并行数据处理,提高程序效率。

默认方法

Java历史已经很久了,但是目前为了让集合支持Stream接口,我们需要针对集合提供一个stream的方法,但是已有很多的第三方库实现了Collection接口,如果贸然在接口中添加方法,则会破坏向前兼容的属性。所以Java8提供了默认方法,能够保持向前兼容。

  • Java8允许在接口内声明静态方法
  • Java8引入的默认方法,可以指定接口方法的默认实现(返回类型之前使用default修饰)

但是默认方法的引入在某些情况下会引入一些冲突,类似C++多继承中的菱形继承问题,这里Java8有一个解决冲突的规则,

  1. 类中的方法优先级最高。类或父类中声明的方法优先级高于任何声明为默认方法的优先级
  2. 如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体
  3. 最后,如果还是无法判断,继承了多个接口的类必须通过显式覆盖和调用期望的方法显式地选择使用哪一个默认方法实现

Optional

Optional就是防止NullPointerException的出现而存在的一个特性,其实它在语义方面给予我们更多更多的代码可读性,设想当一个类的属性使用Optional进行包装,使用这个属性的人就可以了解到这个属性可能为null值,使用的时候就会小心谨慎,但是当一个属性没有使用Optional包装,也就是说我可以放心的使用该引用,而不需要担心NullPointerException。但是这需要一个team的约定。

Optional也可以在某些需要判定引用是否为null的地方去除if else判断来使得代码更加简洁。

CompletableFuture

这个接口使得灵活的完成组合式的异步编程,是针对Future接口进一步的功能增强,但是相对于RxJava这种异步编程库,其语义还是差一些,不过还是可以了解一下的。

新的日期和时间API

Java8解决的另外一个重要问题是解决之前老版本Java中java.util.Date类以及其他用于建模日期时间类设计上的缺陷(易变性、糟糕的偏移值、默认值和命令)

关于Java中日期时间的操作,以后尽量使用java.time包下的几个新的类,包含LocalDate, LocalTime, Instant, DurationPeriod

Java不断的革新自己使得自己适应现在的编程场景,作为一名技术人员当然也需要不断的更新自己的知识,保证自己也不断的跟随着浪潮前进。

Java的演化-Java8实战笔记的更多相关文章

  1. java编写service详细笔记 - centos7.2实战笔记(windows类似就不在重复了)

    java编写service详细笔记 - centos7.2实战笔记(windows类似就不在重复了)  目标效果(命令行启动服务): service xxxxd start #启动服务  servic ...

  2. <<Java RESTful Web Service实战>> 读书笔记

    <<Java RESTful Web Service实战>> 读书笔记 第一章   JAX-RS2.0入门 REST (Representational State ransf ...

  3. java8--类加载机制与反射(java疯狂讲义3复习笔记)

    本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...

  4. Java8学习笔记----Lambda表达式 (转)

    Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家       本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...

  5. java8实战:filter的简单使用

    <JAVA8实战>中的例子 要实现的功能:通过Apple的color或weight属性,对List<Apple>进行筛选. 1.首先定义com.owl.entity.Apple ...

  6. Java工程师之Redis实战系列教程前言&目录

    系列前言 Java工程师之Redis实战系列教程,同其他教程一样,均是在下学习笔记,本系列主要参考自<Redis-in-action>,将书本中的有趣的例子转化为能解决特定问题的示例程序, ...

  7. Java8实战及自己的总结

    java8 介绍 java8是2014年3月份,由Oracle发布的一个版本,又称之为jdk1.8,是现再我们在学习和工作中用的最多的一个版本.   在jdk1.8中,java8以添加非常多的新特性, ...

  8. Java8实战——自己的总结

    java8 介绍   java8是2014年3月份,由Oracle发布的一个版本,又称之为jdk1.8,是现再我们在学习和工作中用的最多的一个版本.   在jdk1.8中,java8以添加非常多的新特 ...

  9. Tars | 第0篇 腾讯犀牛鸟开源人才培养计划Tars实战笔记目录

    腾讯犀牛鸟开源人才培养计划Tars实战笔记目录 前言 在2021年夏,笔者参加了腾讯首届开源人才培养计划的Tars项目,负责Subset流量管理规则的Java语言JDK实现.其中写作几篇开源实战笔记, ...

随机推荐

  1. Java调用C# DLL

    由于项目需要,利用了短信猫,但是一个短信猫会加载多个串口,而只需要其AT口,通过java代码,获取其AT口对应的串口号比较困难,于是通过C#获取,这里直接调用C#生成的DLL,但java不能直接调用C ...

  2. 过渡与动画 - steps调速函数&CSS值与单位之ch

    写在前面 上一篇中我们熟悉五种内置的缓动曲线和(三次)贝塞尔曲线,并且基于此完成了缓动效果. 但是如果我们想要实现逐帧动画,基于贝塞尔曲线的调速函数就显得有些无能为力了,因为我们并不需要帧与帧之间的过 ...

  3. winform在鼠标操作时要判断是否按下Ctrl键

    (Control.ModifierKeys & Keys.Control) == Keys.Control

  4. 倒水问题 (FillUVa 10603) 隐式图

    题意:本题的题意是给你三个杯子,第一二个杯子是空的,第三个杯子装满水,要求是量出一定容量d升的水.若是得不到d升的水,那就让某一个杯子里面的水达到d',使得d'尽量接近d升. 解题思路:本题是给出初始 ...

  5. 本地yum仓库搭建及rpm软件包定制

    环境内核信息: [root@zabbix-01 ~]# uname -a Linux lodboyedu-01 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:2 ...

  6. Linux下实现视频读取(三)---Buffer的准备和数据读取

    前面主要介绍的是:V4L2 的一些设置接口,如亮度,饱和度.曝光时间,帧数,增益.白平衡等.今天看看V4L2 得到数据的几个关键ioctl,Buffer的申请和数据的抓取. 1. 初始化 Memory ...

  7. 局域网使用的IP地址范围

    局域网可用的IP地址范围为: A类地址:10.0.0.0 - 10.255.255.255  B类地址:172.16.0.0 - 172.31.255.255 C类地址:192.168.0.0 -19 ...

  8. UVA12493 - Stars(求1-N与N互质的个数)欧拉函数

    Sample Input 3 4 5 18 36 360 2147483647 Sample Output 1 1 2 3 6 48 1073741823 题目链接:https://uva.onlin ...

  9. .NET Core 已经实现了PHP JIT,现在PHP是.NET上的一门开发语言

    12月23日,由开源中国联合中国电子技术标准化研究院主办的2017源创会年终盛典在北京万豪酒店顺利举行.在本次大会上,链家集团技术副总裁.PHP 开发组核心成员鸟哥发表了以 " PHP Ne ...

  10. 关于 getsockname、getpeername和gethostname、gethostbyname

    一.gethostname,gethostbyname的用法 这两个函数可以用来获取主机的信息.gethostname:获取主机的名字gethostbyname:通过名字获取其他的信息(比如ip) 1 ...