Java Development Kit (JDK) 1.8,也被称为Java 8,是Java编程语言的一个重要更新,它引入了许多新的特性和改进。以下是一些关键的JDK 1.8特性及其用法示例:
1. Lambda表达式
Lambda表达式允许你更简洁地表示匿名函数。
示例:
// 使用Lambda表达式简化匿名类
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// Java 8之前
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.compareTo(b);
}
});
// Java 8使用Lambda表达式
Collections.sort(names, (String a, String b) -> a.compareTo(b));
2. 方法引用
方法引用提供了一种引用已存在方法的方式。
示例:
// 使用方法引用
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);
3. Stream API
Stream API用于支持对集合的声明式操作。
示例:
// 使用Stream API过滤和打印偶数
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.stream()
.filter(n -> n % 2 == 0)
.forEach(System.out::println);
Stream API 是 Java 8 中引入的一个非常重要的特性,它支持对集合数据进行声明式操作。以下是一些常用的 Stream API 方法:
中间操作(Intermediate operations)
这些操作返回的是一个新的 Stream,可以有一个或多个连续的中间操作。
-
filter - 过滤元素,返回符合条件的数据。
stream.filter(s -> s.startsWith("a"));
-
map - 将每个元素映射到对应的结果。
stream.map(String::toUpperCase);
-
flatMap - 将每个元素转换为一个新的 Stream,然后将所有生成的 Stream 连接成一个 Stream。
stream.flatMap(word -> Stream.of(word.split("")));
-
sorted - 对 Stream 进行排序。
stream.sorted();
-
distinct - 去除重复元素。
stream.distinct();
-
limit - 限制 Stream 的大小。
stream.limit(10);
-
skip - 跳过前 n 个元素。
stream.skip(5);
终端操作(Terminal operations)
这些操作返回的是一个结果或者一个副作用,比如返回一个值、打印元素、将元素收集到一个集合中等。
-
forEach - 对每个元素执行一个操作。
stream.forEach(System.out::println);
-
collect - 将 Stream 转换为其他形式,比如 List、Map、Set 等。
List<String> list = stream.collect(Collectors.toList());
-
reduce - 通过一个起始值,反复利用 BinaryOperator 来处理和累积元素,返回一个值。
int sum = stream.reduce(0, Integer::sum);
-
min - 返回 Stream 中的最小值。
Optional<String> min = stream.min(Comparator.naturalOrder());
-
max - 返回 Stream 中的最大值。
Optional<String> max = stream.max(Comparator.naturalOrder());
-
count - 返回 Stream 中元素的数量。
long count = stream.count();
-
anyMatch - 检查 Stream 中是否至少有一个元素匹配给定条件。
boolean anyMatch = stream.anyMatch(s -> s.startsWith("a"));
-
allMatch - 检查 Stream 中是否所有元素都匹配给定条件。
boolean allMatch = stream.allMatch(s -> s.startsWith("a"));
-
noneMatch - 检查 Stream 中是否没有元素匹配给定条件。
boolean noneMatch = stream.noneMatch(s -> s.startsWith("a"));
-
findFirst - 返回 Stream 的第一个元素。
Optional<String> first = stream.findFirst();
-
findAny - 返回 Stream 的任意一个元素。
Optional<String> any = stream.findAny();
这些方法可以组合使用,以创建复杂的数据流转换和操作。例如,你可以先过滤元素,然后对其进行排序,最后将结果收集到一个列表中。
4. 默认方法
默认方法允许在接口中添加非抽象方法实现。
示例:
interface Vehicle {
default void print() {
System.out.println("This is a vehicle.");
}
}
class Car implements Vehicle {
// Car类可以不实现print方法,因为它有默认实现
}
Vehicle myCar = new Car();
myCar.print(); // 输出: This is a vehicle.
5. 重复注解
Java 8允许在同一声明或类型使用同一注解多次。
示例:
@interfaceHints {
Hint[] value();
}
@Repeatable(Hints.class)
@interface Hint {
String value();
}
@Hint("hint1")
@Hint("hint2")
class Person {}
6. 类型注解
类型注解可以用于任何类型的使用,而不仅仅是声明。
示例:
@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
@interface NonNull {
}
Map<@NonNull String, @NonNull Object> map = new HashMap<>();
7. 新的日期和时间API
Java 8引入了新的日期和时间API在java.time
包下。
示例:
// 使用新的日期和时间API
LocalDate today = LocalDate.now();
LocalTime time = LocalTime.now();
System.out.println("Today's Date: " + today);
System.out.println("Current Time: " + time);
这些特性极大地提高了Java编程的灵活性和表达能力,Lambda表达式和Stream API的引入,它们简化了代码并提高了代码的可读性。