Java 8 新特性有哪些?

JavaSE 8新特性

目录
1、lambda表达式
2、Stream api
3、javaFx
4、新的日期和时间api
5、并发增强
6、Nashorn
7、其他改进
1、lambda表达式

1.1、什么是Lambda表达式?为什么要使用lambda表达式?
Lambda 表达式是可以允许开发人员编写简洁的”计算片段”,并将它们传递给其他的代码。允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。

1.2、 lambda表达式的格式:参数 -> 一个表达式
重要特征:
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指明表达式返回了一个数值。

1.3、一个lambda表达式包括三部分:
一段代码
参数
自由变量,这里的“自由”指的是那些不是参数并且没有在代码中定义的变量。含有自由变量的代码块被称为 “闭包(closure)”
注意:
Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。
Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。

2.1、Stream API
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream(流)是一个来自数据源的元素队列并支持聚合操作。将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结果。

集合接口有两个方法来生成流:
stream() − 为集合创建串行流。
parallelStream() − 为集合创建并行流。

常用API

filter()  //过滤
map()  // 将流地元素映射成另一个类型
distinct()  // 去除流中重复地元素
sorted()  // 对元素进行排序
forEach()  // 对流中地每个元素执行某个操作
peek()  // 与forEach方法类似,但该方法会返回一个新的流,forEach无返回。
limit()  // 截取流中地前几个元素
skip()  // 调高流中前面几个元素
toArray() // 将流转换为数组
reduce() // 归约,将每个元素组合起来形成一个新的值
collect()  // 对流中元素汇总
anyMatch() // 匹配流中地元素,类似方法有 allMatch() noneMatch()
findFirst() // 查找第一个元素
findAny() //类似findfirst()
max()  // 求最大值
min()  // 求最小值
count()  // 求总数

Stream 提供了新的方法 ‘forEach’ 来迭代流中的每个数据。
Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。

使用示例:
1)创建一个Stream。
2)在一个或者多个步骤中,指定将初始Stream转换为另一个Stream的中间操作。
3)使用一个终止操作来产生一个结果,该操作会强制它之前的延迟操作立即执行。在这之后,该Stream就不会再被使用了。

在这里插入图片描述

1.3、JavaFX
2007年,Sun引入了一项新技术 — JavaFX,让它作为Flash的竞争者,它运行在Java VM上,但是有其自己的编程语言,称为 JavaFX Script。该语言专门针对动画和其他效果进行了优化。2011年,Oracle发布了一个新版本JavaFX2.0,它提供了JavaAPI并且不再需要使用另一门语言编写。再 Java7 update6版本中, JavaFX2.2已经与JDK和JRE绑定到了一起,自此JavaFX 的版本号与 Java保持一致。

1.4 新的日期和时间API
Java 8 在 java.time 包下提供了很多新的 API。
两个比较重要的 API:
Local(本地) − 简化了日期时间的处理,没有时区的问题。
Zoned(时区) − 通过制定的时区处理日期时间。
新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。

1.5 并发增强
针对原子值操作, 提供了 LongAdder 和 LongAccumulator 的API 。
ConcurrentHashMap 增强:提供了lambda表达式来进行 原子操作,批量操作等。
Arrays 提供了并行数组操作。
针对多线程操作, 提供了CompletableFuture API 。

1.6 Nashorn
Java 自带了javascript解释器 Rhino(犀牛),它是一个由Java编写的开源的JavaScript解释器。Rhino工作得很好,但是速度一般。

Java8以后,借助为动态语言设计的新JVM指令,来创建一个更有效率的Javascript解释器。因此 Nashorn项目诞生了。 Nashorn非常快,并且它允许你在一个高度调优的虚拟机上集成Java与Javascript。它还对Javascript的ECMAScript标准具有极好的兼容性。

1.7 其他改进

字符串:String 增加了 join 方法.
数字类:Short,Integer,Long,Float,Double提供了sum,max,min用来在流操作中作为聚合函数使用。 Integer 类支持了无符号数据计算, 例如 以前的 Byte表示 -128 到127 的范围,现在可以调用静态方法 Byte.toUnsignedInt(b)来获取一个从 0 到 255 的值。
新的数学函数:addExact,multiplyExact 等, floorMod。
集合:增加 removeIf : 会删除所有匹配的值。 增加了replaceAll 方法。 Iterator接口增加了forEachRemaining:能够将剩余的迭代元素都传递给一个函数。 Comparator 接口增加了许多有用的方法,comparing:接受一个“键提取器”函数,将某类型T映射为一个可比较的类型(例如String)。
文件:Files 为使用流读取文件行及访问目录项提供了一些简便的方法。 提供了官方的Base64编码/解码。
注解:提供了可重复的注解及可用于类型的注解。
其他: 增加了Objects工具类, java.util.Logger新增了lambda支持,用于延迟消息。 正则表达式增加了命名捕获组。 JDBC升级到4.2 – java.sql 包中的Date、Time和Timestamp类都提供了一些方法,可以与java.time包下对应的LocalDate,LocalTime和LocalDateTime类相互转换。

猜你喜欢

转载自blog.csdn.net/weixin_40307206/article/details/107644526