JDK8的新特性
JDK8中有增加了很多新特性,这里主要列举一些对于编写代码会有影响的新特性,举例说明这些新特性是如何帮助我们改善我们的开发效率的。
Lambda表达式
Lambda表达式允许你将函数作为参数传递给方法,或者将代码块作为数据处理。这使得编写简洁、易读的代码变得更加容易。
JDK8之前的写法:
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello, Lambda!");
}
};
runnable.run();
==========================================
List<String> names = Arrays.asList("张三", "李四", "王五");
names.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
JDK8的写法:
Runnable runnable = () -> System.out.println("Hello, Lambda!");
runnable.run();
==========================================
List<String> names = Arrays.asList("张三", "李四", "王五");
names.forEach(System.out::println);
以后我再也不new接口了,只要碰到new接口,我就想着用Lambda表达式来写,确实简单了很多,也可以早点下班回家陪老婆孩子了。
接口的默认方法和静态方法
在JDK 8中,接口可以包含默认方法和静态方法。这使得接口可以拥有更丰富的方法定义,提高了代码的可读性和灵活性。
JDK8之前的写法:
接口的写法大家都懂的,我这就不写了。
JDK8的写法:
public interface MyInterface {
default void sayHello() {
System.out.println("Hello");
}
static void printMessage() {
System.out.println("This is a static method in an interface.");
}
}
这个新特性我在项目中有用到,就是写实体类转换时,我们将实体类转换都写在接口中,然后使用mapstruct框架编译成实现代码,有时碰到复杂的转换,mapstruct不能直接帮我们转换,需要我们手动实现,为了代码的统一管理,我又想将实现代码写在接口中,正当陷入两难时,发现了这个新特性,解决了我既想统一管理,又想实现功能,又想早点下班的纠结。
函数编程
高阶函数是接受一个或多个函数作为参数,并返回一个新函数的函数。在Java 8及以后的版本中,你可以使用Consumer
,Function
,Predicate
等接口来定义高阶函数。
JDK8的写法:
//Function中第一个泛型指的是参数的数据类型
//Function中第二个泛型指的是返回值的数据类型
Function<Integer, Integer> fn = a -> a + 5;
System.out.println(fn.apply(1));
//BiFunction中第一、二个泛型指的是参数的数据类型
//BiFunction中第三个泛型指的是返回值的数据类型
BiFunction<String, String, Integer> bfn = (a, b) -> Integer.parseInt(a) + Integer.parseInt(b);
System.out.println(bfn.apply("11", "12"));
//Consumer中的泛型指的是参数的数据类型
//此函数没有返回值
Consumer<Integer> cn = System.out::println;
cn.accept(1);
//Predicate中的泛型指的是参数的数据类型
//返回值是布尔类型
Predicate<String> pr = x -> x.equals("6666");
System.out.println(pr.test("777"));
函数编程在写一些简单的功能时非常好用,一行代码搞定需求。
方法引用
在Java 8中,引入了一个新的特性,即方法引用。方法引用让Java语言的表达力更强,让代码更简洁、更优雅。方法引用可以看作是Lambda表达式的一种简化写法,或者说是一种特殊情况。它提供了一种简洁的语法来调用对象的方法或构造函数。
方法引用可以分为两类:
- 静态方法引用
- 实例方法引用
JDK8的写法:
//静态方法引用
Function<Integer, Integer> fn = Calculator::add;
System.out.println(fn.apply(3));
//实例方法引用
CalculatorInstance calculatorInstance = new CalculatorInstance();
Function<Integer, Integer> fnIns = calculatorInstance::add;
System.out.println(fnIns.apply(6));
方法引用要和Lambda、函数式编程一起使用才能发挥最大效果。
Stream API
Stream API 是一个用于处理数据的新抽象,它提供了一种高效且易于使用的处理数据的方式。你可以使用 Stream API 对集合、数组等进行复杂的操作,如过滤、映射、归约等。通过Stream API,可以更加简洁高效地处理集合数据。
JDK8的写法:
//将集合中的英文全部变成大写并输出
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> uppercasedNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(uppercasedNames); // 输出[ALICE, BOB, CHARLIE]
//计算集合中所有数据的和
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
System.out.println(sum);
Nashorn JavaScript引擎
JDK 8引入了Nashorn JavaScript引擎,这个引擎可以在Java中运行JavaScript代码。这个特性使得Java开发人员可以更加方便地与JavaScript进行交互,提高了Java与JavaScript的互操作性。
JDK8的写法:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.eval("var x = 1; var y = 2; print(x + y);");