Java 8新特性

Java 8简介

Java 8是Java语言的一个重要版本,引入了许多新特性,包括Lambda表达式、Stream API、新的日期时间API等。

主要特性概览

// 1. Lambda表达式 List names = Arrays.asList("Alice", "Bob", "Charlie"); names.forEach(name -> System.out.println(name)); // 2. Stream API List numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .filter(n -> n % 2 == 0) .mapToInt(Integer::intValue) .sum(); // 3. 新的日期时间API LocalDate today = LocalDate.now(); LocalTime now = LocalTime.now(); LocalDateTime dateTime = LocalDateTime.now();

Lambda表达式

Lambda表达式是Java 8引入的一种简洁的匿名函数表示方式,使代码更加简洁和易读。

// 1. 基本语法 // 无参数 Runnable runnable = () -> System.out.println("Hello"); // 单参数 Consumer consumer = name -> System.out.println("Hello, " + name); // 多参数 BinaryOperator add = (a, b) -> a + b; // 2. 方法引用 List names = Arrays.asList("Alice", "Bob", "Charlie"); names.forEach(System.out::println); // 3. 构造函数引用 Supplier> listSupplier = ArrayList::new; // 4. 实际应用 List people = Arrays.asList( new Person("Alice", 25), new Person("Bob", 30), new Person("Charlie", 35) ); // 按年龄排序 people.sort((p1, p2) -> p1.getAge() - p2.getAge()); // 过滤并转换 List names = people.stream() .filter(p -> p.getAge() > 30) .map(Person::getName) .collect(Collectors.toList());

Stream API

Stream API提供了一种高效且易于使用的数据处理方式,支持函数式编程风格。

// 1. 创建Stream Stream stream1 = Stream.of("A", "B", "C"); Stream stream2 = Arrays.stream(new Integer[]{1, 2, 3}); Stream stream3 = list.stream(); // 2. 中间操作 List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 过滤 List evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); // 映射 List numberStrings = numbers.stream() .map(String::valueOf) .collect(Collectors.toList()); // 排序 List sortedNumbers = numbers.stream() .sorted() .collect(Collectors.toList()); // 3. 终端操作 // 收集 List collected = numbers.stream() .filter(n -> n > 5) .collect(Collectors.toList()); // 归约 int sum = numbers.stream() .reduce(0, Integer::sum); // 统计 IntSummaryStatistics stats = numbers.stream() .mapToInt(Integer::intValue) .summaryStatistics();

新的日期时间API

Java 8引入了新的日期时间API,解决了旧API的许多问题,提供了更好的日期时间处理能力。

// 1. 基本日期时间类 // 日期 LocalDate date = LocalDate.now(); LocalDate specificDate = LocalDate.of(2024, 3, 20); // 时间 LocalTime time = LocalTime.now(); LocalTime specificTime = LocalTime.of(14, 30, 0); // 日期时间 LocalDateTime dateTime = LocalDateTime.now(); LocalDateTime specificDateTime = LocalDateTime.of(2024, 3, 20, 14, 30); // 2. 日期时间操作 // 日期计算 LocalDate tomorrow = date.plusDays(1); LocalDate lastMonth = date.minusMonths(1); // 时间计算 LocalTime nextHour = time.plusHours(1); LocalTime previousMinute = time.minusMinutes(1); // 3. 格式化 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formatted = dateTime.format(formatter); // 4. 时区处理 ZonedDateTime zonedDateTime = ZonedDateTime.now(); ZoneId zoneId = ZoneId.of("Asia/Shanghai"); ZonedDateTime shanghaiTime = ZonedDateTime.now(zoneId);

Optional类

Optional类用于处理可能为null的值,避免空指针异常。

// 1. 创建Optional Optional optional1 = Optional.of("Hello"); Optional optional2 = Optional.empty(); Optional optional3 = Optional.ofNullable(null); // 2. 使用Optional // 获取值 String value = optional1.orElse("Default"); String value2 = optional2.orElseGet(() -> "Default"); // 条件处理 optional1.ifPresent(System.out::println); // 链式操作 Optional result = optional1 .filter(s -> s.length() > 5) .map(String::toUpperCase); // 3. 实际应用 public class User { private String name; private Optional email; public Optional getEmail() { return email; } } User user = new User(); String email = user.getEmail() .orElse("No email provided");

接口默认方法

Java 8允许在接口中定义默认方法,使接口可以包含具体实现。

// 1. 定义带默认方法的接口 public interface Vehicle { void start(); default void stop() { System.out.println("Vehicle stopping..."); } default void honk() { System.out.println("Beep beep!"); } } // 2. 实现接口 public class Car implements Vehicle { @Override public void start() { System.out.println("Car starting..."); } // 可以选择性地重写默认方法 @Override public void honk() { System.out.println("Car honking!"); } } // 3. 多重继承 public interface Flyable { void fly(); default void land() { System.out.println("Landing..."); } } public class FlyingCar implements Vehicle, Flyable { @Override public void start() { System.out.println("Flying car starting..."); } @Override public void fly() { System.out.println("Flying car flying..."); } }

实践练习

练习1:使用Stream API处理数据

public class StreamExercise {
    public static List processNames(List people) {
        // 使用Stream API处理人员列表
        // 1. 过滤年龄大于30的人
        // 2. 获取他们的名字
        // 3. 将名字转换为大写
        // 4. 按字母顺序排序
        // 5. 收集结果
    }
}