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.Datejava.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的功能集,不仅在语言层面带来了革命性的变化,也在工具链、性能优化和运行时环境方面体现了显著的进步。