让我来详细列举 Java 8 引入的主要特性,并分别说明它们的概念、使用场景和示例。
1. Lambda 表达式
概念:
Lambda 表达式是一种匿名函数,它允许你传递简洁的代码作为方法参数。它可以用来替代 Java 中笨重的匿名类写法,使代码更加简洁和易读。
使用场景:
Lambda 表达式通常用于函数式接口(只有一个抽象方法的接口),如 java.util.function
包中定义的接口,例如 Predicate
、Consumer
、Function
等。
示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 使用 Lambda 表达式遍历集合并打印每个元素
names.forEach(name -> System.out.println(name));// 使用 Lambda 表达式进行集合过滤
names.removeIf(name -> name.startsWith("A"));
System.out.println(names); // 输出: [Bob, Charlie]
2. Stream API
概念:
Stream API 是 Java 8 中引入的一套用于处理集合数据的工具,它支持函数式编程风格的操作,如映射、过滤、归约等。
使用场景:
Stream 可以用于替代传统的循环迭代,使得数据处理变得更加简洁和易于并行化处理。
示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用 Stream 进行过滤、映射和归约操作
int sum = numbers.stream().filter(n -> n % 2 == 0) // 过滤偶数.mapToInt(n -> n * 2) // 将每个元素乘以2.sum(); // 求和
System.out.println(sum); // 输出: 12
3. 方法引用(Method References)
概念:
方法引用提供了一种引用已存在的方法(静态方法、实例方法或构造方法)作为 Lambda 表达式的替代。
使用场景:
当 Lambda 表达式中只是简单地调用一个已有方法时,可以使用方法引用,使代码更加简洁。
示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 使用方法引用遍历集合并打印每个元素
names.forEach(System.out::println);
4. 默认方法(Default Methods)
概念:
接口中可以定义具体的方法实现,这些方法可以直接在接口中使用或者由实现类继承和覆盖。
使用场景:
允许接口在不破坏现有实现的情况下,向已有的接口添加新的方法。
示例:
interface Vehicle {void start();default void stop() {System.out.println("Vehicle stopped");}
}// 实现接口
class Car implements Vehicle {@Overridepublic void start() {System.out.println("Car started");}
}// 使用默认方法
Car car = new Car();
car.start(); // 输出: Car started
car.stop(); // 输出: Vehicle stopped
5. Optional 类
概念:
Optional 类设计用来解决空指针异常问题。它是一个容器对象,可以包含或不包含非空值。
使用场景:
可以避免显式地检查 null 值,使得代码更加健壮。
示例:
String name = null;
Optional<String> optionalName = Optional.ofNullable(name);
String result = optionalName.orElse("DefaultName");
System.out.println(result); // 输出: DefaultName
6. 新的日期时间 API(java.time 包)
概念:
Java 8 引入了新的日期时间 API,使得日期和时间的处理更加简单和直观。
使用场景:
用于取代旧的 java.util.Date
和 java.util.Calendar
类,提供了更多功能和灵活性。
示例:
// 创建日期对象并格式化输出
LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = date.format(formatter);
System.out.println(formattedDate); // 输出当前日期的格式化字符串
7. CompletableFuture 类(异步编程)
概念:
CompletableFuture 类提供了一个强大的编程模型,用于异步编程和并发任务的处理。
使用场景:
可以简化异步任务的处理,支持任务链式调用和组合。
示例:
CompletableFuture.supplyAsync(() -> "Hello").thenApplyAsync(result -> result + " World").thenAcceptAsync(System.out::println);
8. 接口的静态方法
概念:
Java 8 允许在接口中定义静态方法,这些方法可以直接由接口名调用,无需实现类实现。
使用场景:
可以在接口中提供一些通用的静态工具方法,例如工厂方法等。
示例:
interface MathUtils {static int add(int a, int b) {return a + b;}
}// 调用接口中的静态方法
int sum = MathUtils.add(3, 5);
System.out.println(sum); // 输出: 8
9. 新的重复注解(Repeatable Annotations)
概念:
Java 8 允许相同的注解在同一个地方重复使用,而不需要使用容器注解包装。
使用场景:
用于简化代码,特别是在需要多次使用相同注解时更为方便。
示例:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyRepeatedAnnos.class)
@interface MyAnnotation {String value();
}// 定义容器注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface MyRepeatedAnnos {MyAnnotation[] value();
}// 使用重复注解
@MyAnnotation("Annotation 1")
@MyAnnotation("Annotation 2")
class MyClass {// 类内容
}
10. 类型注解(Type Annotations)
概念:
Java 8 引入了类型注解,使得开发人员可以在更多的地方使用注解,例如使用在类实例化上、类型强转上等。
使用场景:
可以提供更加丰富的元数据信息,增强代码的可靠性和安全性。
示例:
class MyGenericClass<@NonNull T> {public void processData(@Nonnull String data) {// 方法体}
}
11. Nashorn JavaScript 引擎
概念:
Java 8 中引入了 Nashorn JavaScript 引擎,它允许在 Java 程序中直接执行 JavaScript 代码。
使用场景:
可以用于嵌入 JavaScript 逻辑,与 Java 代码交互,实现更加灵活的应用程序。
示例:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");try {// 执行 JavaScript 代码engine.eval("print('Hello Nashorn');");
} catch (ScriptException e) {e.printStackTrace();
}
12. PermGen(永久代)的移除
概念:
Java 8 中移除了永久代(PermGen),取而代之的是元空间(Metaspace)。
使用场景:
提升了 JVM 的内存管理和性能,使得更灵活地管理类的元数据。
示例:
无具体代码示例,这是 JVM 层面的优化。
这些特性使得 Java 8 和后续版本成为一个更加现代化和功能丰富的编程语言,进一步提升了开发效率和代码的可维护性。