一文详解 JDK8 的 Lambda、Stream、LocalDateTime("深入解析JDK 8新特性:Lambda表达式、Stream流操作与LocalDateTime使用详解")
原创
一、Lambda表达式
Lambda表达式是JDK 8中最重要的新特性之一,它为Java带来了函数式编程的赞成。Lambda表达式允许我们以更简洁、更灵活的方法实现接口的匿名实现。
1.1 Lambda表达式的基本语法
Lambda表达式的基本语法格式为:(参数类型 参数名称) -> {代码块}。下面是一个简洁的示例:
Runnable r = () -> System.out.println("Hello, Lambda!");
r.run();
1.2 函数式接口
函数式接口是指只包含一个抽象方法的接口。Java 8引入了一个新的注解@FunctionalInterface,用来描述一个接口是函数式接口。例如:
@FunctionalInterface
public interface MyFunctionalInterface {
void doSomething(String message);
}
1.3 方法引用
方法引用是Lambda表达式的一个特例,它允许我们直接引用已存在的方法来代替Lambda表达式。方法引用的语法格式为:类名::方法名。例如:
BiFunction
biFunction = String::concat; System.out.println(biFunction.apply("Hello, ", "World!"));
二、Stream流操作
Stream API是Java 8中另一个重要的新特性,它允许我们以声明式的方法处理数据集合。Stream API可以操作各种数据源,如集合、数组等,并提供了充足的操作符来处理数据。
2.1 Stream的创建
创建Stream的方法有多种,以下是一些常用的创建方法:
List
list = Arrays.asList("a", "b", "c", "d"); Stream
stream = list.stream(); // 从集合创建 Stream
stream2 = Stream.of(1, 2, 3, 4); // 使用of方法创建 Stream
stream3 = Stream.iterate("a", s -> s + "a").limit(5); // 使用iterate方法创建 Stream
stream4 = Stream.generate(Math::random).limit(5); // 使用generate方法创建
2.2 Stream的中间操作
Stream API提供了充足的中间操作符,如map、filter、sorted等,以下是一些常用的中间操作示例:
List
list = Arrays.asList("a", "b", "c", "d", "e"); Stream
stream = list.stream(); stream.filter(s -> s.compareTo("c") > 0) // 过滤
.map(String::toUpperCase) // 变成大写
.sorted() // 排序
.forEach(System.out::println); // 打印
2.3 Stream的终端操作
Stream API的终端操作包括forEach、collect、reduce等,以下是一些常用的终端操作示例:
List
list = Arrays.asList("a", "b", "c", "d", "e"); int sum = list.stream()
.mapToInt(s -> s.length()) // 变成字符串长度
.sum(); // 求和
System.out.println(sum); // 输出字符串总长度
三、LocalDateTime
LocalDateTime是Java 8中引入的新日期时间API的一部分,它替代了旧的java.util.Date类,提供了更充足的日期时间处理功能。
3.1 LocalDateTime的基本使用
LocalDateTime用于描述不含时区的日期和时间,以下是一些基本的使用示例:
LocalDateTime now = LocalDateTime.now(); // 获取当前日期时间
LocalDateTime dateTime = LocalDateTime.of(2022, Month.NOVEMBER, 2, 10, 30); // 创建指定日期时间
LocalDateTime plusDays = now.plusDays(5); // 加5天
LocalDateTime minusHours = now.minusHours(2); // 减2小时
System.out.println(now); // 输出当前日期时间
System.out.println(dateTime); // 输出指定日期时间
System.out.println(plusDays); // 输出加5天后的日期时间
System.out.println(minusHours); // 输出减2小时后的日期时间
3.2 日期时间的格式化
LocalDateTime类提供了格式化日期时间的方法,以下是一些格式化的示例:
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = now.format(formatter);
System.out.println(formattedDateTime); // 输出格式化后的日期时间
3.3 日期时间的转换
LocalDateTime可以与旧的Date类彼此转换,以下是一些转换的示例:
LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println(date); // 输出转换后的Date对象
Date date2 = new Date();
LocalDateTime localDateTime2 = LocalDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault());
System.out.println(localDateTime2); // 输出转换后的LocalDateTime对象
总结
Lambda表达式、Stream流操作和LocalDateTime是JDK 8中引入的三个重要新特性,它们为Java编程带来了新的大概性和便利。Lambda表达式促使代码更简洁、更易读;Stream API提供了充足的数据处理能力;LocalDateTime则提供了更升级更新的日期时间处理功能。掌握这些新特性,将使Java开发者能够更高效地编写出高质量的代码。