jdk1.8(Java 8)是java语言开发的一个主要版本,Oracle公司于2014年3月18日发布Java 8.它支持函数式编程,新的JavaScript引擎等等。
1. Lambda表达式
它允许把函数作为一个方法的参数
格式:(parameters参数)-> expression表达体或方法体
parameters参数: 类似于方法中的形参列表,这里的参数是函数式接口里的参数
->:"被用于"的意思
方法体:可以是表达式也可以是代码块,是函数接口里方法的实现,如果负责运算的代码无法用表达式表示,可以使用编写方法实现,但必须使用{}包围并按需明确使用return语句。
lambda实现多线程:
public static void main(String[] args) {
//lambda表达式
new Thread(() -> System.out.println("线程1")).start();
//方法体
new Thread( ()->{
for(int i=0;i<6;i++) {
System.out.println("线程2执行第:"+i);
}
}).start();
}
2. 方法引用
方法引用提供了非常有用的语法,通过方法的名字来指向一个方法,可以直接引用已有Java类或对象(实例)的方法或构造方法。 与lambda联合使用,方法引用可以使语言的构造更简洁紧凑,减少冗余代码。使用一对冒号::,后面只是方法名,不能加()。forEach也是jdk1.8的新特性。
public static void main(String[] args) {
Arrays.asList("a","b","f","g").forEach(e ->{
String m = "123"+e;
System.out.println(m);
});
/**打印结果
* 123a
123b
123f
123g
*/
ArrayList<String> list = new ArrayList<String>();
list.add("ass");
list.add("bsx");
list.add("dsx");
list.add("ert");
list.forEach(System.out::println);
}
3. 函数式接口
就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为lambda表达式。
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
// Predicate<Integer> predicate = n -> true
// n 是一个参数传递到 Predicate 接口的 test 方法
// n 如果存在则 test 方法返回 true
System.out.println("输出所有数据:");
// 传递参数 n
eval(list, n->true);
// Predicate<Integer> predicate1 = n -> n%2 == 0
// n 是一个参数传递到 Predicate 接口的 test 方法
// 如果 n%2 为 0 test 方法返回 true
System.out.println("输出所有偶数:");
eval(list, n-> n%2 == 0 );
// Predicate<Integer> predicate2 = n -> n > 3
// n 是一个参数传递到 Predicate 接口的 test 方法
// 如果 n 大于 3 test 方法返回 true
System.out.println("输出大于 3 的所有数字:");
eval(list, n-> n > 3 );
}
public static void eval(List<Integer> list, Predicate<Integer> predicate) {
for(Integer n: list) {
if(predicate.test(n)) {
System.out.print(n + " "+" ");
}
}
System.out.println();
}
执行结果:
4. 接口的默认方法
即在一个接口里可以使用 default关键字声明具体的方法,这个特征又叫做扩展方法,同时也允许使用static声明具体方法。
public interface Test1 {
void sayMsg(String msg);
default void write(String str) {
}
public static boolean writes(String str) {
if(!StringUtils.isNullOrEmpty(str.trim())) {
return true;
}
return false;
}
}
5. 新工具
新的编译工具,如:Nashorn引擎jjs,类依赖分析器jdeps.
6.Stream API
新添加的Stream API(java.util.stream)把真正的函数式编程风格引入到java中。
7. Date Time API
加强对日期与时间的处理
8. Optional类
Optional类用来解决空指针异常
9. Nashorn ,JavaScript引擎
提供了一个新的Nashorn JavaScript 引擎,它允许我们在jvm上运行特定的JavaScript应用。
进jdk1.8的新特性小结至此,如有不同意见欢迎留言指正。。。