Java8常用的新特性总结
1.1. Java8常用特性总览
1. 2. Lambda表达式
Lambda表达式是一种匿名函数,它允许我们以更简洁的方式编写代码。它的语法形式为(参数列表) -> {表达式或代码块}
。Lambda表达式可以与函数式接口一起使用,例如Runnable
接口。
// 使用Lambda表达式创建一个线程
Thread thread = new Thread(() -> {System.out.println("Hello, World!");
});
thread.start();
1.3. 函数式接口
函数式接口是只包含一个抽象方法的接口。Java 8提供了一些内置的函数式接口,例如Predicate
、Consumer
和Function
等。我们可以使用Lambda表达式来实现这些接口的方法。
// 使用Predicate函数式接口过滤集合中的元素
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
System.out.println(evenNumbers); // 输出 [2, 4]
1.4. 方法引用
方法引用是一种更简洁的Lambda表达式的写法,它允许我们直接引用已经存在的方法。方法引用可以是静态方法引用、实例方法引用或构造方法引用。
// 使用方法引用调用静态方法
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);// 使用方法引用调用实例方法
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(System.out::println);// 使用方法引用调用构造方法
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Person> persons = names.stream().map(Person::new).collect(Collectors.toList());
1.5. Stream API
Stream API是Java 8中处理集合数据的新方式。它提供了一种流式操作的方式,可以对集合进行过滤、映射、排序等操作。
// 使用Stream API对集合进行过滤和映射
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> uppercaseNames = names.stream().filter(name -> name.length() > 4).map(String::toUpperCase).collect(Collectors.toList());
System.out.println(uppercaseNames); // 输出 [CHARLIE]// 使用Stream API对集合进行排序
List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5);
List<Integer> sortedNumbers = numbers.stream().distinct().sorted().collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出 [1, 2, 3, 4, 5, 6, 9]
1.6. 默认方法
默认方法是接口中的一种新特性,它允许在接口中定义具有默认实现的方法。这样一来,接口的实现类就不需要强制实现这个方法,可以选择性地覆盖它。
// 定义一个接口
interface Greeting {default void sayHello() {System.out.println("Hello, World!");}
}// 实现接口并调用默认方法
class GreetingImpl implements Greeting {// 可选择性地覆盖默认方法
}Greeting greeting = new GreetingImpl();
greeting.sayHello(); // 输出 Hello, World!
1.7. Optional类
Optional类是一个容器对象,可以包含null或非null的值。它提供了一种更好的方式来处理可能为空的值,避免了空指针异常。
// 使用Optional类处理可能为空的值
Optional<String> name = Optional.ofNullable(getName());
String message = name.orElse("Unknown");
System.out.println(message);// 定义一个可能返回null的方法
public String getName() {// 返回一个可能为null的值
}
1.8. 新的日期和时间API
Java 8引入了全新的日期和时间API,提供了更好的日期和时间处理方式。它解决了旧的Date和Calendar类的许多问题,并提供了更多的功能和灵活性。
// 使用新的日期和时间API
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();System.out.println(date); // 输出当前日期
System.out.println(time); // 输出当前时间
System.out.println(dateTime); // 输出当前日期和时间