java8新特性简记
根据自己的理解记忆方式,提取几个主要的特性。
一、函数式接口相关
@FunctionalInterface:函数式接口,功能接口。
特点:
- 有且仅有一个抽象方法
- 允许静态方法
- 允许默认方法
- 允许java.lang.Object中public类型的方法,这些方法对于函数式接口来说,不被当成是抽象方法,因为所有的函数式接口的实现都是默认继承了Object类,Object类含有该方法的实现。
- 该注解非必须,只要符合函数式接口的条件,可以不加注解,加上注解知识辅助编译器进行检查
它最大的作用是为了支持行为参数传递,如传递以下作为参数:
-
Lambda
-
方法引用
-
函数式接口对应的实例对象
...
添加了该注解之后,从而衍生(or伴生)出以下特性:
1、Lambda表达式
允许把一个方法作为参数传递进方法里。如:
Arrays.asList(1,2,3,4).foreach(i -> System.out.println(i));
2、接口的默认方法实现和静态方法
通过default、static给接口中的方法添加默认实现和静态实现。
默认实现的作用:在接口升级中,如果要给接口添加一个方法,会导致所有实现了接口的类都需要进行方法的实现,添加了默认实现之后,可以降低接口升级的代价,不需要所有的实现类都进行一次实现。
3、方法引用
方法引用指的是可以直接引用java类或对象的方法,使得代码更加简介易懂。
(放到这个大分类下面是因为比较像lambda表达式,lambda是将构造一个函数,方法引用是使用现有函数,都是为了代码的简洁)
- 引用构造方法:ClassName::new
- 引用类静态方法:ClassName::methodName
- 引用类的任意对象方法:ClassName::methodName
- 引用某个对象的方法:instanceName::methodName
二、新的API和工具类
1、新增Optional类
主要是用来处理空指针的异常
2、新增Stream类
把函数式编程的风格引入到java语言。
如:在集合中进行值的匹配
// List<Person> personList
// 判断是否有叫张三的人
boolean hasZS = personList.stream.anyMatch(person -> "张三".equals(person.getName()));
// 判断是否全部小于18
boolean less18 = personList.stream.allMatch(person -> person.getAge() < 18);
3、新增日期API
新增java.time.*; 主要包含了处理日期、时间、时区等操作。
如:
// 通过时区获取当前的日期和时间
Clock c = Clock.system(ZooneId.of("Asia/BeiJing"));
System.out.println(c.millis());
System.out.println(c.instant());
// 获取秒、毫秒
Instant ist = Instant.now();
System.out.println(ist.getEpochSecond());
System.out.println(ist.getEpochMilli());
4、Base64
java8把Base64添加到类库java.util.Base64;中
三、其他
1、js
支持通过java程序来调用js代码
2、并行数组
新增方法用于支持并行数组处理,类似于parrallelSort()。
3、@Repeatable注解
允许注解的重复使用
本文来自博客园,作者:醉千灯,转载请注明原文链接:https://www.cnblogs.com/william-m/p/16251362.html