详解java8的新特性
题记:
Java 8(又称为jdk 1.8)是Java语言开发的一个主要版本,由Oracle公司于2014年3月发布。java 8是Java语言发展史上的一个重要里程碑,它引入了许多新特性,极大地提升了Java语言的现代化程度和开发效率。虽然发布10年了,但是国内可能绝大部分开发者对java 8的新特性知之甚少,更别说在日常开发中深入应用了。本文详细介绍下java 8的主要新特性,权当是帮大家复习吧。
1. 接口的默认方法和静态方法
Java 8允许在接口中定义默认方法和静态方法。默认方法使得接口能够提供具体的实现,而不仅仅是方法签名,这样可以在不破坏现有实现的情况下向接口添加新方法。静态方法则允许在接口中直接提供实用方法,而无需创建实现类。
- 默认方法:使用default关键字来定义。例如:
interface Formula {
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
实现了Formula接口的子类只需要实现calculate方法,默认方法sqrt可以直接使用。
- 静态方法:直接定义在接口中,使用static关键字。例如:
interface Defaulable {
default String notRequired() {
return "Default implementation";
}
static int getDefaultInt() {
return 42;
}
}
2. Lambda表达式
Lambda表达式是Java 8的一大亮点,它允许开发者以简洁的语法创建匿名函数。这种表达式能简化代码,提高代码可读性。Lambda表达式特别适合集合操作和事件处理等场景。
- 基本语法:例如,使用Lambda表达式替代匿名内部类进行排序:
List<String> names = Arrays.asList("jack", "jim", "andy");
names.sort((a, b) -> a.compareTo(b));
- 省略类型:对于函数体只有一行代码的,可以省略大括号{}和return关键字,同时Java编译器可以自动推导出参数类型。例如:
names.sort((a, b) -> a.compareTo(b)); // 可以进一步简化为
names.sort((a, b) -> a.compareToIgnoreCase(b)); // 若函数体只有一行,省略大括号和return
- 使用方法引用:可以使用::关键字来传递方法或者构造函数引用,进一步简化代码。例如:
BiFunction<String, String, Integer> compare = String::compareToIgnoreCase;
3. 函数式接口
函数式接口是指仅包含一个抽象方法的接口,每一个该类型的Lambda表达式都会被匹配到这个抽象方法。因为默认方法不算抽象方法,所以也可以给函数式接口添加默认方法。使用@FunctionalInterface注解可以显式声明一个接口为函数式接口。例如:
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
4. Stream API
Stream API提供了一种高效处理集合元素的管道方式,支持并行处理,简化了集合的遍历、过滤、映射等操作。
例如:
- 使用Stream API过滤集合中的偶数并收集到新的List中:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
- 并行流:并行流是将一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。相比串行的流,并行的流可以很大程度上提高程序的执行效率。
List<Integer> numbers = IntStream.rangeClosed(1, 1000000).boxed().collect(Collectors.toList());
long sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();
5. Optional类
Optional类用于避免空指针异常,它是一个可以包含或不包含非null值的容器对象。
例如:
Optional<String> optional = Optional.ofNullable(getName());
optional.ifPresent(System.out::println);
6. 新的日期和时间API
Java 8引入了新的日期时间API(java.time包),提供了更易用、线程安全且领域驱动的日期和时间类。
例如:
LocalDate today = LocalDate.now();
LocalTime now = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.of(today, now);
7. Nashorn JavaScript引擎
Nashorn引擎允许在JVM上运行JS应用,为Java应用集成脚本功能提供了便利,也为Web开发者在服务器端使用JavaScript打开了大门。不过,Nashorn在Java 11中已被标记为废弃,并最终在Java 15中移除。
8. Base64编解码API
Java 8加入了Base64编解码API,使得在Java标准库中进行Base64编码和解码变得简单直接,不再需要依赖第三方库。
例如:
String originalString = "Java 8 Base64 Encoding and Decoding";
Base64.Encoder encoder = Base64.getEncoder();
String encodedString = encoder.encodeToString(originalString.getBytes(StandardCharsets.UTF_8));
System.out.println(encodedString);
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedBytes = decoder.decode(encodedString);
String decodedString = new String(decodedBytes, StandardCharsets.UTF_8);
System.out.println(decodedString);
-
改进的注解支持
Java 8扩展了注解的使用范围,允许在类型使用注解(包括泛型类型参数、局部变量类型声明、以及强制类型转换),并且引入了重复注解的概念,即同一个注解可以在同一地方多次使用。 -
类型推断机制的加强
Java 8对类型推断机制进行了加强,使得在使用Lambda表达式和泛型时,能够更加简洁地编写代码而不需要显式指定类型。这种改进减轻了程序员的负担,使代码更加清晰,提高了开发效率。
本篇完结。
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,家人们的点赞和关注是我笔耕不辍的动力。