速度更快
代码更少
强大的StreamAPI
便于并行
最大化的减少空指针异常
Lambda表达式<具体做什么事>和函数式接口
Lambda表达式(也叫做闭包)
它允许我们将一个函数当作方法的参数(传递函数),或者说把代码当作数据,从而代替匿名内部类.
Lambda表达式是由用逗号分隔的参数列表、->符号和功能语句块来表示
1 Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );
编译器会根据上下文来推测参数的类型,或者你也可以显示地指定参数类型,只需要将类型包在括号里
1 Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );
如果Lambda的功能语句块太复杂,可以用大括号包起来
1 String separator = ",";
2 Arrays.asList( "a", "b", "d" ).forEach(
3 ( String e ) -> System.out.print( e + separator ) );
Lambda表达式引用类的成员或者局部变量时,类的成员或者局部变量会被隐式地转变成final类型

1 String separator = ",";
2 Arrays.asList( "a", "b", "d" ).forEach(
3 ( String e ) -> System.out.print( e + separator ) );
4 等价于
5 final String separator = ",";
6 Arrays.asList( "a", "b", "d" ).forEach(
7 ( String e ) -> System.out.print( e + separator ) );

Lambda表达式可能会有返回值,编译器会根据上下文推断返回值的类型
如果lambda的语句块只有一行,不需要return关键字
1 Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );
2 等价于
3 Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> {
4 int result = e1.compareTo( e2 );
5 return result;
6 } );
函数接口是一种只有一个方法的接口,像这样地,函数接口可以隐式地转换成lambda表达式。
Java 8提供了一个特殊的注解@FunctionalInterface来克服脆弱性并且显示地表明函数接口的目的
注意: 默认的方法和静态方法(下一节会具体解释)不会违反函数接口的约定

1 @FunctionalInterface
2 public interface FunctionalDefaultMethods {
3 void method();
4
5 default void defaultMethod() {
6 }
7 }

接口的默认方法和静态方法
Java 8增加了两个新的概念在接口声明的时候:默认和静态方法。
Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,实现的类,默认会继承该方法,可以使用或者重写.
默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的
实现类都会通过继承得到这个方法(如果有需要也可以重写这个方法)
Java 8 的另外一个新特性是接口里可以声明静态方法,并且可以实现
1 private interface DefaulableFactory {
2 // Interfaces now allow static methods
3 static Defaulable create( Supplier< Defaulable > supplier ) {
4 return supplier.get();
5 }
6 }
接口的静态方法和默认方法放在一起的示例,::new 是构造方法引用

1 public static void main( String[] args ) {
2 Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new );
3 System.out.println( defaulable.notRequired() );
4
5 defaulable = DefaulableFactory.create( OverridableImpl::new );
6 System.out.println( defaulable.notRequired() );
7 }

四大内置核心接口
Consumer<T>: 消费型接口,对类型为T的对象应用操
作,没有返回值
Void accept(T t)
Supplier<T>: 供给型接口,返回类型为T的对象
Void get(T t)
Function<T,R>: 函数型接口,对类型为T的对象应用操
作,并返回结果。结果是R类型的对象
R apply(T t)
Predicate<T> 断言型接口,确定类型为T的对象是否
满足某约束,并返回boolean 值。
Boolean test(T t)
java 8支持的方法引用和构造器引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致! )
方法引用:使用操作符 “::” 将方法名和对象或类的名字分隔开来。
对象::实例方法
类::静态方法
类::实例方法
compare((x,y) ->x.equals(y),”abc”,”adcd”)
=>
compare(String::equals,”abc”,”abcd”)
注意: 当需要引用方法的第一个参数是调用对象,并且第二个参数是需要引
用方法的第二个参数(或无参数)时: ClassName::methodName
构造器引用
Function<Integer,MyClass> fun=(n) -> new MyClass(n);
Function<Ineger,MyClass> fun = MyClass ::new;

格式: ClassName::new
与函数式接口相结合,自动与函数式接口中方法兼容。
可以把构造器引用赋值给定义的方法,注意:构造器参数
列表要与接口中抽象方法的参数列表一致!

重复注释
Java 8引入了重复注释,允许相同注释在声明使用的时候重复使用超过一次
Optional
Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,
原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且
可以避免空指针异常。
1 Optional< String > fullName = Optional.ofNullable( null );
2 System.out.println( "Full Name is set? " + fullName.isPresent() );
3 System.out.println( "Full Name: " + fullName.orElseGet( () -> "[none]" ) );
4 System.out.println( fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
如果Optional实例有非空的值,
方法 isPresent() 返回true否则返回false。
方法orElseGet提供了回退机制,当Optional的值为空时接受一个方法返回默认值。
map()方法转化Optional当前的值并且返回一个新的Optional实例。
orElse方法和orElseGet类似,但是它不接受一个方法,而是接受一个默认值
Stream
Stream是多个元素的序列,支持串行和并行操作。
Stream操作被分为中间操作和终点操作
中间操作返回一个新的Stream。这些中间操作是延迟的,执行一个中间操作比如filter实际上不会真的做过滤操作,而是创建一个新的
Stream,当这个新的Stream被遍历的时候,它里头会包含有原来Stream里符合过滤条件的元素。
终点操作比如说forEach或者sum会遍历Stream从而产生最终结果或附带结果。终点操作执行完之后,Stream管道就被消费完了,
不再可用。在几乎所有的情况下,终点操作都是即时完成对数据的遍历操作。
Java8 中处理集合的关键抽象概念,支持串行和并行操作。它可以指定你希望对
集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。
使用Stream API 对集合数据进行操作,就类似于使用 SQL语句对数
据库的查询一样。 简而言之,
Stream API 提供了一种高效且易于使用的处理数据的方式
Stream的操作的三个步骤
创建 Stream
一个数据源(如: 集合、数组), 获取一个流 .Arrays.stream Stream.of Collection.stream
Stream.iterate
 中间操作
一个中间操作链,对数据源的数据进行处理,比如进行过滤,去重,映射,排序,跳过(skip),截取(limit)等操作
 终止操作(终端操作)
一个终止操作,执行中间操作链,并产生结果 get()
注意:
①Stream 自己不会存储元素。
②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
日期时间(Java.time)
JAVA8提供了新的时间日期API,放在java。time包下,使用 ISO-8601日历系统的日期、时间、日期和时间,
比如说LocalDate、 LocalTime、 LocalDateTime 类。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息 。Instant时间戳类 ,Duration用于计算俩个“时间”的间隔Perriod用于计算俩个“日期”的间隔
DataTimeFormatter全新的时间格式化类。还加入了对时区的支持,带时区的时间类为:zoneDate,ZoneTime,ZoneDateTime

Clock
LocalDate  只保存有ISO-8601日期系统的日期部分,有时区信息
LocalTime  只保存ISO-8601日期系统的时间部分,没有时区信息
LocalDateTime类合并了LocalDate和LocalTime,它保存有ISO-8601日期系统的日期和时间,但是没有时区信息
ZonedDateTime,它保存有ISO-8601日期系统的日期和时间,而且有时区信息
Duration类,Duration持有的时间精确到纳秒。它让我们很容易计算两个日期中间的差异
Nashorn javascript引擎
Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用
Base64
新的Base64API也支持URL和MINE的编码解码
并行数组
Java 8新增加了很多方法支持并行的数组处理parallelSort()
并发
java.util.concurrent.ConcurrentHashMap中加入了一些新方法来支持聚集操作
java.util.concurrent.ForkJoinPool类中加入了一些新方法来支持共有资源池
java.util.concurrent.locks.StampedLock类提供一直基于容量的锁,这种锁有三个模型来控制读写操作(它被认为是不太有名的
java.util.concurrent.locks.ReadWriteLock类的替代者)

JAVA8新特性简单总结的更多相关文章

  1. java8新特性全面解析

    在Java Code Geeks上有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Java ...

  2. Java8新特性

    Java8新特性 Java8主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等. 1.函数式接口 Java 8 引入 ...

  3. Java系列 - 用Java8新特性进行Java开发太爽了

    本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome/ 前言 从开始写博客到现在已经过去3个 ...

  4. Java8 新特性之Stream----java.util.stream

    这个包主要提供元素的streams函数操作,比如对collections的map,reduce. 例如: int sum = widgets.stream() .filter(b -> b.ge ...

  5. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  6. Java8新特性之二:方法引用

    上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...

  7. Java8新特性(一)_interface中的static方法和default方法

    什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...

  8. Java8 新特性 | 如何风骚走位防止空指针异常

    文章整理翻译自 https://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/ 文章首发于个人网站: https://www.exce ...

  9. 干货 | Java8 新特性教程

    本教程翻译整理自 https://github.com/winterbe/java8-tutorial 本教程首发自个人网站: https://www.exception.site/java8/jav ...

随机推荐

  1. 关于手机适配中的rem的学习随笔

    githup 下载地址 :https://github.com/comjustforfun/remformobile adaptivejs利用rem解决移动端页面开发的自适应问题 页面模板初始化的时候 ...

  2. (转)extern关键字两种场景的使用

    第一种场景 -- extern extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见.用其声明的变量或函数应该在别的文件或同一文件的其它地方定义. 例如语句:exter ...

  3. mysql数据库从删库到跑路之mysql存储引擎

    一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图片用pn ...

  4. Flask之flask-script模块使用

    Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任 ...

  5. python的数据类型的有序无序

    列表有序可变 字典无序不可变 元组不可变 集合无序不可变 数字不可变 字符串不可变

  6. Linux下修改时间

    修改linux的时间可以使用date指令 date命令的功能是显示和设置系统日期和时间. 输入date 查看目前系统时间. 修改时间需要 date -功能字符 修改内容 命令中各选项的含义分别为: - ...

  7. 对称加密与非对称加密,以及RSA的原理

    一 , 概述 在现代密码学诞生以前,就已经有很多的加密方法了.例如,最古老的斯巴达加密棒,广泛应用于公元前7世纪的古希腊.16世纪意大利数学家卡尔达诺发明的栅格密码,基于单表代换的凯撒密码.猪圈密码, ...

  8. 重命名文件或文件夹(mv命令与rename命令)

    在Linux下重命名文件或目录,可以使用mv命令或rename命令,这里分享下二者的使用方法. mv命令既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子:将/a目录 ...

  9. 特性(property)/静态方法(staticmethod)/类方法(classmethod)/__str__的用法

    property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 1 import math 2 class Circle: 3 def __init__(self,radius): #圆的 ...

  10. [转]HTML标签元素的分类

      在讲解CSS布局之前,我们需要提前知道一些知识,在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素和内联块状元素. 常用的块状元素有: <div>.<p ...