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
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. 收集结果
}
}