JDK8新特性
Java 8(也称为Java SE 8)在2014年发布,是Java发展史上的一次重大革新,引入了许多革命性的特性,极大地提升了开发效率和代码的表达力。以下是Java 8的主要新特性和相应的代码示例:
1. Lambda表达式
Lambda表达式是Java 8最引人注目的特性,它允许以一种简洁的方式传递行为给方法或者存储为变量。Lambda使得函数式编程风格在Java中成为可能。
// 传统写法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello, World!");
}
}).start();
// Lambda表达式写法
new Thread(() -> System.out.println("Hello, Lambda!")).start();
2. 函数式接口与@FunctionalInterface
函数式接口是只有一个抽象方法的接口,可以隐式转换为Lambda表达式。@FunctionalInterface
注解可以帮助编译器检查是否符合函数式接口的定义。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.sort(String::compareToIgnoreCase); // 使用方法引用进行排序
3. 方法引用
方法引用提供了一种更简洁的方式来引用已有方法,避免了Lambda表达式的冗余。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.sort(String::compareToIgnoreCase); // 使用方法引用进行排序
4. Stream API
Stream API提供了一种新的数据处理方式,可以对集合进行高效的、声明式的操作,如过滤、映射、排序、聚合等。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(Integer::intValue)
.sum();
System.out.println(sum); // 输出偶数之和
5. 默认方法和静态方法在接口中
Java 8允许在接口中定义默认方法和静态方法,这样可以在不破坏现有实现的情况下向接口添加新功能。
interface Printable {
default void print() {
System.out.println("Default printing logic");
}
static void showInfo() {
System.out.println("This is a static method in an interface.");
}
}
class Book implements Printable {
// 不需要实现print()方法,使用默认实现
}
Book book = new Book();
book.print(); // 调用默认实现
Printable.showInfo(); // 直接通过接口名调用静态方法
6. Optional类
Optional是一个容器类,用来表示可能存在也可能不存在的值,避免了空指针异常,鼓励更安全的编程习惯。
Optional<String> optional = Optional.ofNullable(findUserById(100));
optional.ifPresent(System.out::println); // 如果值存在,则打印
7. Date/Time API (JSR 310)
Java 8引入了全新的日期时间API,提供了一套更为简洁、直观且线程安全的时间日期处理类,如LocalDate
, LocalTime
, LocalDateTime
, ZonedDateTime
等,取代了旧的java.util.Date
和java.util.Calendar
。
LocalDate today = LocalDate.now();
System.out.println("Today's date: " + today);
LocalTime now = LocalTime.now();
System.out.println("Current time: " + now);
LocalDateTime dateTime = LocalDateTime.of(today, now);
System.out.println("Current date-time: " + dateTime);
8. 并行数组处理
Java 8增强了Arrays
类,提供了并行处理数组的方法,利用多核处理器的优势加速计算。
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int sum = Arrays.stream(numbers).parallel().sum();
System.out.println("Sum (parallel): " + sum);
9. Nashorn JavaScript引擎
Java 8引入了Nashorn JavaScript引擎,可以直接在Java应用中执行JavaScript代码,促进了Java与JavaScript的互操作性。
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.eval("print('Hello from JavaScript!')");
10. Base64编解码
Java 8在java.util
包中加入了Base64编解码的支持,使得在Java中处理Base64编码的数据更加方便。
String original = "Java 8 Base64 Encoding";
String encoded = Base64.getEncoder().encodeToString(original.getBytes());
System.out.println("Encoded: " + encoded);
String decoded = new String(Base64.getDecoder().decode(encoded));
System.out.println("Decoded: " + decoded);
11. 改进的类型推断
Java 8增强了类型推断机制,使得在某些情况下可以省略泛型参数,使得代码更加简洁。
Map<String, List<String>> map = new HashMap<>();
12. 并发改进
除了Fork/Join框架的持续优化外,Java 8还引入了StampedLock
,提供了一种更为灵活的锁机制,支持乐观读、悲观读写等模式,适用于复杂并发控制场景。
StampedLock lock = new StampedLock();
long stamp = lock.writeLock();
try {
// 写操作
} finally {
lock.unlockWrite(stamp);
}
13. 支持重复注解
Java 8允许在同一个声明或类型上使用相同的注解多次。这需要注解本身被定义为@Repeatable
,并且通常会有一个容器注解来持有重复的注解实例。
@Repeatable(MyAnnotations.class)
@interface MyAnnotation {
String value();
}
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotations {
MyAnnotation[] value();
}
@MyAnnotation("First")
@MyAnnotation("Second")
public class MyClass {
// ...
}
14. 参数名称反射访问
Java 8允许在运行时通过反射访问方法和构造函数的参数名称,这对于自动生成文档、日志记录或进行元数据编程非常有用。
public class Example {
public void myMethod(String param1, int param2) {
// ...
}
}
Method method = Example.class.getMethod("myMethod", String.class, int.class);
Parameter[] parameters = method.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter.getName());
}
15. 更强的类型检查
Java 8编译器对泛型的类型检查更加严格,特别是在涉及通配符的场景下。这有助于提前发现潜在的类型错误。
16. 类依赖分析工具(jdeps)
Java 8引入了jdeps
工具,它能够分析类文件依赖关系,帮助开发者理解和优化项目的模块结构,为后续Java模块化系统(Java Platform Module System, JPMS)的引入做了铺垫。
jdeps --class-path myapp.jar mypackage.MyClass
17. PermGen空间移除
在Java 8中,永久代(PermGen)被元空间(Metaspace)取代。元空间使用本地内存而不是虚拟机堆内存,解决了与PermGen相关的内存泄露和溢出问题,同时提供了更好的可扩展性。
18. 新的命令行工具
除了jdeps
,Java 8还引入了其他几个有用的命令行工具,例如jjs
(Nashorn JavaScript引擎的命令行接口)、jstat
(监控虚拟机统计信息)和jcmd
(发送诊断命令到正在运行的JVM)等,为开发者提供了更多实用工具。
19. 改进的GC算法
Java 8对垃圾收集器进行了多项改进,包括G1垃圾收集器的增强,使其成为默认的选择之一,特别是在大型堆的应用场景下提供了更好的性能。
这些更深层次的改进和特性进一步完善了Java 8的功能集,不仅在语言层面带来了革命性的变化,也在工具链、性能优化和运行时环境方面体现了显著的进步。