Lambda表达式是一个匿名函数(指的是没有函数名的函数),它基于数学中的λ演算得名,直接对应于其中的Lambda抽象。Lambda表达式可以表示闭包。
Lambda表达式允许把函数作为一个方法的参数。Lambda表达式的基本语法:
(parameters)-> expression
或者
(parameters)->{statements;}
Lambda表达式是通过函数式接口(只有一个方法的普通接口)来实现的。函数式接口可以被隐式地转换为Lambda表达式。
使用关键字default可以给接口中的方法添加默认实现,此外,接口中还可以定义静态方法。接口也可以包含行为,而不仅仅包含方法的定义,但是不能在接口中定义私有方法。
方法引用指的是可以直接引用Java类或对象的方法。它可以被看成是一种更加简洁易懂的Lambda表达式。
方法引用共有下面4种形式:
1)引用构造方法:ClassName::new
2)引用类静态方法:ClassName::methodName
3)引用特定类的任意对象方法:ClassName::methodName
4)引用某个对象的方法:instanceName::methodName
引入了重复注解机制,相同的注解在同一个地方可以声明多次。
扩展了注解,注解被使用的范围更广。可用于类型,注解可以应用在任何地方:局部变量、泛型类、⽗类与接⼝的实现,就连⽅法的异常也能添加注解。
编译器能根据显示声明的已知的信息 推断出你没有显示声明的类型。
Map<String, Object> map = new Map<String, Object>();
等价于
Map<String, Object> map = new Map<>();
JDK1.8通过在编译的时候增加-parameters选项,以及增加反射API与Parameter.getName()方法实现了获取方法参数名的功能。
引入Optional类来处理空指针的情况,从而增强了代码的可读性。
引入函数式编程的风格,提供了parallel、map、reduce等方法,这些方法用于增加对原生类并发处理的能力。
1)Calendar:实现日期和时间字段之间转换,它的属性是可变的。因此,它不是线程安全的。
2)DateFormat:格式化和分析日期字符串。
3)Date:用来承载日期和时间信息,它的属性是可变的。因此,它不是线程安全的。
新的java.time主要包含了处理日期、时间、日期/时间、时区、时刻(instants)和时钟(clock)等操作。
// Clock类通过指定一个时区,可以获取到当前的时刻、日期与时间
Clock c = Clock.system(ZoneId.of(“Asia/Shanghai”); //上海时区
//Instant 使用
Instant ist = Instant.now();
ist.getEpochSecond(); //精确到秒
ist.toEpochMilli(); //精确到毫秒
增加API使得通过Java程序来调用JavaScript代码。
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.getClass().getName();
把Base64编码添加到了标准类库中。
对数组并行处理的方法(parallelXxx)。
int arr[] = {
1,5,8,18,3,14};
Arrays.parallelSort(arr);
Arrays.stream(arr).forEach(i->System.out.pront(i + " "));