- java8其实就是java1.8,java1.8作为java的一个重大版本,以下是它新增的一些新特性
1、 lambda表达式和函数式接口
- Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理:函数式开发者非常熟悉这些概念。很多JVM平台上的语言(Groovy、Scala等)从诞生之日就支持Lambda表达式,但是Java开发者没有选择,只能使用匿名内部类代替Lambda表达式。
- 函数式接口
1、函数式接口指的是只有一个函数的接口,这样就可以隐式的转化为lambda表达式
2、java特别脆弱,如果里面多余一个函数则就破坏了函数式接口,所以就出现了一个注解(@FunctionalInterface)
2、接口的默认方法和静态方法
- 接口里添加了以default 修饰的默认方法,实现它的子类可以重写 ,也可不重写
- 接口里添加了static静态类,直接接口名直接调用静态方法
3、方法引用
public static class Car {
public static Car create( final Supplier< Car > supplier ) {
return supplier.get();
}
public static void collide( final Car car ) {
System.out.println( "Collided " + car.toString() );
}
public void follow( final Car another ) {
System.out.println( "Following the " + another.toString() );
}
public void repair() {
System.out.println( "Repaired " + this.toString() );
}
}
//第一种方法引用的类型是构造器引用,语法是Class::new,或者更一般的形式:Class<T>::new。注意:这个构造器没有参数。
cars.forEach( Car::collide );
//第二种方法引用的类型是静态方法引用,语法是Class::static_method。注意:这个方法接受一个Car类型的参数。
cars.forEach( Car::collide );
//第三种方法引用的类型是某个类的成员方法的引用,语法是Class::method,注意,这个方法没有定义入参
cars.forEach( Car::repair );
4 、重复注解
- jdk1.5以后添加了注解的功能,但是不支持重复注解,1.8之后支持了重复注解
package com.javacodegeeks.java8.repeatable.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class RepeatingAnnotations {
@Target( ElementType.TYPE )
@Retention( RetentionPolicy.RUNTIME )
public @interface Filters {
Filter[] value();
}
@Target( ElementType.TYPE )
@Retention( RetentionPolicy.RUNTIME )
@Repeatable( Filters.class )
public @interface Filter {
String value();
};
@Filter( "filter1" )
@Filter( "filter2" )
public interface Filterable {
}
public static void main(String[] args) {
for( Filter filter: Filterable.class.getAnnotationsByType( Filter.class ) ) {
System.out.println( filter.value() );
}
}
}
5、类型判断
- java8 优化了类型判断,在编译期间就可判断类型
6、拓宽注解的应用场景
- Java 8拓宽了注解的应用场景。现在,注解几乎可以使用在任何元素上:局部变量、接口类型、超类和接口实现类,甚至可以用在函数的异常定义上。下面是一些例子:
package com.javacodegeeks.java8.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Collection;
public class Annotations {
@Retention( RetentionPolicy.RUNTIME )
@Target( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } )
public @interface NonEmpty {
}
public static class Holder< @NonEmpty T > extends @NonEmpty Object {
public void method() throws @NonEmpty Exception {
}
}
@SuppressWarnings( "unused" )
public static void main(String[] args) {
final Holder< String > holder = new @NonEmpty Holder< String >();
@NonEmpty Collection< @NonEmpty String > strings = new ArrayList<>();
}
}
java 编译器的新特性
java官方库的新特性
- optional
- streams
- date/time api
- nashorn js 引擎
- 并行数组
- 并发性
新的java 工具
- nashorm 引擎:jjs
- 类依赖分析器:jdeps