java Optional类与新的日期时间API
Java 8 引入了 Optional
类和新的日期时间 API,这两个特性都旨在解决旧版本 Java 中的一些常见问题,使得代码更加健壮、可读性更强。下面分别介绍 Optional
类和新的日期时间 API 的概念、用途及其使用方法。
Java 8 的 Optional 类
Optional
类是一个可以为 null 的容器对象。它被设计用来帮助开发者更好地处理那些可能为 null 的值,从而避免空指针异常(NullPointerException)。使用 Optional
类可以使代码更加安全,同时也提高了代码的可读性和可维护性。
Optional
类的主要方法
Optional.of(T value)
:如果value
不为 null,则创建一个Optional
实例;否则抛出NullPointerException
。Optional.ofNullable(T value)
:如果value
不为 null,则创建一个Optional
实例;否则返回一个空的Optional
实例。Optional.empty()
:返回一个空的Optional
实例。Optional.isPresent()
:如果值存在,则返回true
;否则返回false
。Optional.orElse(T other)
:如果值存在,则返回该值;否则返回other
。Optional.orElseGet(Supplier<? extends T> other)
:如果值存在,则返回该值;否则返回由Supplier
提供的值。Optional.orElseThrow(Supplier<? extends RuntimeException> exceptionSupplier)
:如果值存在,则返回该值;否则抛出由Supplier
提供的异常。
示例
public class OptionalExample {
public static void main(String[] args) {
String name = null;
// 使用Optional.ofNullable避免NullPointerException
Optional<String> optionalName = Optional.ofNullable(name);
// 判断是否存在
if (optionalName.isPresent()) {
System.out.println(optionalName.get());
} else {
System.out.println("Name is not present.");
}
// 使用orElse提供默认值
String defaultName = optionalName.orElse("Default Name");
System.out.println(defaultName);
// 使用orElseGet提供默认值
String defaultName2 = optionalName.orElseGet(() -> "Default Name from Supplier");
System.out.println(defaultName2);
// 使用orElseThrow抛出异常
try {
String requiredName = optionalName.orElseThrow(() -> new IllegalArgumentException("Name must be provided"));
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
}
Java 8 的新的日期时间 API
Java 8 引入了一个全新的日期时间 API,旨在解决旧版日期时间类(如 java.util.Date
和 java.util.Calendar
)存在的各种问题。新的日期时间 API 更加现代、易于使用,并且支持 ISO 8601 标准。
主要类
java.time.LocalDate
:代表日期,不包含时间信息。java.time.LocalTime
:代表时间,不包含日期信息。java.time.LocalDateTime
:代表日期和时间,不包含时区信息。java.time.ZonedDateTime
:代表日期、时间和时区。java.time.Instant
:代表某个时刻的时间戳,通常用于网络传输。java.time.Period
:代表时间段。java.time.Duration
:代表持续时间。
示例
import java.time.*;
public class DateTimeExample {
public static void main(String[] args) {
// 获取当前日期
LocalDate today = LocalDate.now();
System.out.println("Today's date is " + today);
// 获取当前时间
LocalTime now = LocalTime.now();
System.out.println("Current time is " + now);
// 获取当前日期时间
LocalDateTime nowDateTime = LocalDateTime.now();
System.out.println("Current date and time is " + nowDateTime);
// 设置特定日期
LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1);
System.out.println("Birthday is " + birthday);
// 设置特定时间
LocalTime meetingTime = LocalTime.of(13, 30);
System.out.println("Meeting time is " + meetingTime);
// 设置特定日期时间
LocalDateTime appointment = LocalDateTime.of(2023, Month.APRIL, 15, 10, 0);
System.out.println("Appointment is " + appointment);
// 时区
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("America/New_York"));
System.out.println("Current date and time in New York is " + zonedDateTime);
// 时间戳
Instant instant = Instant.now();
System.out.println("Current timestamp is " + instant);
// 日期间隔
Period period = Period.between(LocalDate.of(2020, 1, 1), LocalDate.of(2021, 1, 1));
System.out.println("Period between dates is " + period);
// 时间间隔
Duration duration = Duration.between(LocalTime.of(12, 0), LocalTime.of(13, 30));
System.out.println("Duration between times is " + duration);
}
}
总结
Optional
类
Optional
类是一个可以为 null 的容器对象,设计用来帮助开发者更好地处理那些可能为 null 的值,从而避免空指针异常。使用 Optional
类可以使代码更加安全,同时也提高了代码的可读性和可维护性。
新的日期时间 API
新的日期时间 API 更加现代、易于使用,并且支持 ISO 8601 标准,解决了旧版日期时间类存在的各种问题。主要类包括 LocalDate
、LocalTime
、LocalDateTime
、ZonedDateTime
、Instant
、Period
和 Duration
等,涵盖了日期时间的各种操作需求。
通过使用 Optional
类和新的日期时间 API,可以显著提高 Java 应用程序的质量和可靠性。