JDK8新特性Oracle甲骨文公司终于在2014年3月发布了Java8正式版,它是java的一个里程牌版本,带来了诸多新特性。官网介绍:一、针对java编程语言(JavaProgrammingLanguage)二、针对集合(Collections)三、CompactProfiles四、安全性五、JavaFX六工具(tools)七、国际化八、部署九、Date-TimePackage十、Scriptingjava编程语言(JavaProgrammingLanguage)1:lambda表达式:一种新的语言特性,能够把函数作为方法的参数或将代码作为数据。lambda表达式使你在表示函数接口(具有单个方法的接口)的实例更加紧凑。2.方法引用是lambda表达式的一个简化写法,所引用的方法其实是lambda表达式的方法体实现,这样使代码更容易阅读3.默认方法:Java8引入defaultmethod,或者叫virtualextensionmethod,目的是为了让接口可以事后添加新方法而无需强迫所有实现该接口的类都提供新方法的实现。也就是说它的主要使用场景可能会涉及代码演进。4.重复注解:允许在同一声明或类型(类,属性,或方法)的使用中多次使用同一个注解5.改善了类型推断6.方法参数反射函数式接口Java8引入的一个核心概念是函数式接口(FunctionalInterfaces)。接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。同时,引入了一个新的注解:@FunctionalInterface。可以把他它放在一个接口前,表示这个接口是一个函数式接口。这个注解是非必须的,只要接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解@FunctionalInterface进行声明。@FunctionalInterfacepublicinterfaceRunnable{publicabstractvoidrun();}Lambda表达式函数式接口的重要属性是:我们能够使用Lambda实例化它们,Lambda表达式实例化函数接口作为方法参数,或者将代码作为数据对待。在Java8之前:匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差。在Java8:Lambda表达式的应用则使代码变得更加紧凑,可读性增强;Lambda表达式使并行操作大集合变得很方便,可以充分发挥多核CPU的优势,更易于为多核处理器编写代码;Lambda表达式由三个部分组成:第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;第二部分为一个箭头符号:-;第三部分为方法体,可以是表达式和代码块。语法如下:1.方法体为表达式,该表达式的值作为返回值返回。(parameters)-expression2.方法体为代码块,必须用{}来包裹起来,且需要一个return返回值,但若函数式接口里面方法返回值是void,则无需返回值。Lambda和匿名内部类匿名表示法button.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){System.out.print(“这是内部类的表示法!);}});Lambada表示法button.addActionListener((ActionEvente)-System.out.print(HellloLambdainactionPerformed));Lambda举例//类型声明MathOperationInteger,Integeraddition=(Integera,Integerb)-a+b;//不用类型声明MathOperationInteger,Integersubtraction=(a,b)-a-b;//大括号中的返回语句MathOperationLong,Longmultiplication=(a,b)-{returna*b;};//没有大括号及返回语句MathOperationFloat,Floatdivision=(Floata,Floatb)-a/b;System.out.println(10+5=+tester.operate(10,5,addition));方法引用是lambda表达式的一个简化写法,所引用的方法其实是lambda表达式的方法体实现:ListStringnames=Arrays.asList(zhangsan,lisi,wangwu,zhaoliu);Collections.sort(names,String::compareTo);FunctionInteger,Stringf1=String::valueOf;FunctionString,Stringfunction=String::new;SupplierStringsupplier=String::new;默认方法Java8引入defaultmethod,或者叫virtualextensionmethod,目的是为了让接口可以添加新方法的实现,而无需强迫所有实现该接口的类都提供新方法的实现。比中:publicinterfaceMyInterface{defaultvoidmyMethod(){System.out.println(MyInterface);}}重复注解重复注解:允许在同一声明或类型(类,属性,或方法)的使用中多次使用同一个注解@Repeatable(Authorities.class)public@interfaceAuthority{Stringrole();}public@interfaceAuthorities{Authority[]value();}publicclassRepeatAnnotationUseNewVersion{@Authority(role=Admin)@Authority(role=Manager)publicvoiddoSomeThing(){}}泛型的推断改进jdk1.5:ListApplebox=newArrayListApple();Jdk1.7:ListApplebox=newArrayList();Jdk1.8:ListStringlist=newArrayList();list.addAll(newArrayList());//由于addAll期望获得Collection?extendsString类型的参数,JDK8可以根据声明的类型自动判断。//lambda表达式的推断MathOperationInteger,Integersubtraction=(a,b)-a-b;Stream介绍提供了新包java.util.stream,这个包提供了StreamAPI功能,支持以函数风格(functional-style)去处理流中的元素。在CollectionsAPI中已经整合了StreamAPI,可以在集合上进行批量操作(bulkoperations),如顺序或并行的map-reduce转换。StreamAPI提供了一种操作大数据的接口,让数据操作更容易和更快。它具有过滤、映射以及减少遍历数等方法,这些方法分两种:中间方法和终端方法,“流”抽象天生就该是持续的,中间方法永远返回的是Stream,因此如果我们要获取最终结果的话,必须使用终点操作才能收集流产生的最终结果Sream概念Stream不是集合元素,也不是数据结构,它相当于一个高级版本的Iterator,不可以重复遍历里面的数据,像水一样,流过了就一去不复返。它和普通的Iterator不同的是,它可以并行遍历,普通的Iterator只能是串行,在一个线程中执行。操作包括:中间操作和最终操作(只能操作一遍)串行流操作在一个线程中依次完成。并行流在多个线程中完成,主要利用了JDK7的Fork/Join框架来拆分任务和加速处理。相比串行流,并行流可以很大程度提高程序的效率流的种类流有串行和并行两种,串行流上的操作是在一个线程中依次完成,而并行流则是在多个线程上同时执行。并行与串行的流可以相互切换:通过stream.sequential()返回串行的流,通过stream.parallel()返回并行的流。相比较串行的流,并行的流可以很大程度上提高程序的执行效率。下面是分别用串行和并行的方式对集合进行排序。list.stream().sequential()).sorted().count();流的操作分类:中间中间操作:Intermediate主要是用来对Stream做出相应转换及限制流,实际上是将源Stream转换为一个新的Stream,以达到需求效果。filter():元素过滤:Stream.of(1,2,3,4,5).filter(item-item3)sorted():元素排序:Stream.of(1,2,3,1,2,3).distinct()map():元素映射:Stream.of(“a”,“b”,“hello”).map(item-item.toUpperCase());flatMap:元素映射:Stream.of(1,2,3).Map(integer-Stream.of(integer*10))distinct():去重操作concat():拼接:Stream.concat(Stream.of(1,2,3),Stream.of(4,5));Peek:peek方法生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数,并且消费函数优先执行skip:跳过。skip方法将过滤掉原Stream中的前N个元素,返回剩下的元素所组成的新StreamIterate:其返回的也是一个无限长度的Stream,通过函数f迭代对给指定的元素种子而产生无限连续有序Stream,其中包含的元素可以认为是:seed,f(seed),f(f(seed))无限循环generator方法,返回一个无限长度的Stream,其元素由Supplier接口的提供。流的操作分类:短路短路操作(Short-circuiting):对流中的元素进行判断、取值等操作。allMatch:判断Stream中的元素是否全部满足指定条件。如果全部满足条件返回true,否则返回false。anyMatch:判断Stream中的是否有满足指定条件的元素。如果最少有一个满足条件返回true,否则返回false。findAny:操作用于获取含有Stream中的某个元素的Optional,如果Stream为空,则返回一个空的Optional。由于此操作的行动是不确定的,其会自由的选择Stream中的任何元素findFirst:findFirst操作用于获取含有Stream中的第一个元素的Optional,如果Stream为空,则返回一个空的Optional。、limit:截取原Stream前指定值N个元素noneMatch:noneMatch方法将判断Stream中的所有元素是否满足指定的条件,如果所有元素都不满足条件,返回true;否则,返回false.流的操作分类:最终操作最终操作:最终操作只能操作一遍,操作完成后,该流就会关闭了。如再进行操作,便会报错。forEach():遍历每个元素。reduce():把Stream元素组合起来。例如,字符串拼接,数值的sum,min,max,average都是特殊的reduce。collect():返回一个新的集合。min():找到最小值。max():找到最大值。中间操作:过滤、排序Filter:过滤,侧重于过滤。forEach:循环St