前言
Java8已经正式推出3年,但是在实际生产环境中使用的却不是很多。
但Java8是自Java5后最具革命性的版本,这么有革命性的版本我们更需要掌握。
通过系列文章,将Java8的新特性尽量的都介绍清楚。
导航
Java8特性总结(一)概述
Java8特性总结(二)Lambda表达式,函数式接口,方法引用
Java8特性总结(三)接口方法,注解,日期,Base64
数字Java8
195新的文件增加到了JDK8(目前JDK总共4240文件)
93个新类, 89新接口,13新的枚举
2699新方法, 56新的构造函数,49新属性
46接口被注解为@FunctionalInterface(函数式接口)
213接口默认方法
68静态接口方法
Java8的新特性概述
1:Lambda表达式
Lambda表达式也可以称为闭包,是Java最关键的变化。
可以简单理解成是匿名类的另一种表现形式(极端匿名类)。
定义个线程:
Lambda表达式形式
Thread tLambda=new Thread(()->System.out.println("I am Lambda"));
匿名类形式
Thread t=new Thread(new Runnable(){
@Override
public void run()
{
System.out.println("I am old!");
}
});
2:注解@FunctionalInterface(函数式接口)
函数式接口的定义极大增加了Java语言的灵活性,当然推出函数式接口也是为了配合Lambda表达式,使java更好的支持Lambda。
同时由于出现了函数式接口,也衍生了49个函数式接口。
主要集中在java.util.function
这个包下面。
包括开发过程经常使用的一些接口也都声明成@FunctionalInterface
,如:
Runnable
FileFilter
FilenameFilter
Comparator
Callable
3:接口方法
接口方法很好理解,就是在接口中定义了可以执行的方法。
这个和我们以前的理解完全不一样了。
当然这个函数可以理解成和静态函数相差不多就可以了。
public interface InterfaceMethod
{
void test();
default String valueOf(int i)
{
reutrn String.valueOf(i);
}
}
这个valueOf就可以在实现里被调用了。
实际上这个仅仅是丰富了Java接口的功能,并不违反面向对象的思想,因为无论怎样,接口还是和抽象类是有很大差距的。
接口定义不了属性的,这个是本质的区别。
4:Concurrency
CompletionStage 一个异步计算的一个阶段对象,当一个阶段执行完成后,会唤起下一个阶段对象的执行。
CompletableFuture(核心)这个类继承了Feature,支持Lambda表达式,支持并行计算,并且是事件驱动。可以等待完成,可以取消等操作。
java.lang.concurrent.atomic
这个包下也有一些改动。
5:方法引用
方法的引用
Function<Integer,String> func=String::valueOf;
构造函数的引用
Supplier<String> str=String::new;
实际这都是为了保证函数式接口可以最大的发挥功效。这个我们在后面进行详细的讨论,这个无敌功能。
结合面向对象思想,可以相当灵活的对现有的代码进行重构,以及可以设计相当灵活的实现过程。
发散一点,工作流用这个是不是无敌了。。。。。。
6:并行数组
Arrays中增加了一些方法,使执行的过程采用并行处理,提高处理速度,充分利用多核的优势。
7:HashMap的变化
Java7的HashMap的实现规则是数组+链表,但是在特殊的情况下,就成了链表,严重的影响了查询速度。
因此在Java8这个进行了改变,HashMap编程了数组+链表/红黑树,这个就避免了以前出现的问题,同时保证了执行效率。
8:Stream
这个新增功能太强大了.
可以理解为集合就是一个元素序列,Stream后可以执行各种操作。极大的方便了对集合的操作,因为至少省略了循环。
9:日期
Java日期一直被诟病,太不好用了,这不Java8改了,但是个人感觉还是一般。。。。。
10: Base64
Base64编码引入了标准包java.util里,使用更方便了。
11:注解的细微变化–重复注解
注解可以声明为数组。
统一个注解可以使用多个。
反射获得注解是一个列表。
@interface Hints
{
Hint[] value();
}
@Repeatable(Hints.class)
@interface Hint
{
String value();
}
12: jjs
jjs是个基于Nashorn引擎的命令行工具。它接受一些JavaScript源代码为参数,并且执行这些源代码。
13: 类依赖分析器jdeps
它可以显示Java类的包级别或类级别的依赖。它接受一个.class文件,一个目录,或者一个jar文件作为输入。jdeps默认把结果输出到系统输出(控制台)上。
14: PermGen空间被移除了
PermGen空间被移除了,取而代之的是Metaspace。
JVM选项-XX:PermSize与-XX:MaxPermSize分别被-
XX:MetaSpaceSize与-XX:MaxMetaspaceSize所代替。
部分参考文章
http://winterbe.com/posts/2014/03/29/jdk8-api-explorer/
http://ifeve.com/java-8-tutorial-2/
http://www.importnew.com/11908.html
https://www.javacodegeeks.com/2014/05/java-8-features-tutorial.html
http://www.importnew.com/23164.html