Lambda表达式简介

Java 8引入了Lambda表达式,这是一种简洁的匿名函数表示方法。Lambda允许将函数作为参数传递,简化了代码编写。基本语法为(parameters) -> expression(parameters) -> { statements; }

Lambda表达式常用于替代匿名内部类,特别是在集合操作和事件处理中。例如,排序一个字符串列表可以简化为list.sort((a, b) -> a.compareTo(b))

函数式接口

函数式接口是只包含一个抽象方法的接口,Java 8通过@FunctionalInterface注解明确标识。常见的函数式接口包括RunnableComparatorPredicate

Java 8在java.util.function包中新增了多个函数式接口,如Function<T,R>Consumer<T>Supplier<T>。这些接口为Lambda表达式提供了标准化的使用方式。

Stream API基础

Stream API是Java 8中处理集合数据的强大工具。Stream不存储数据,而是通过管道操作(如过滤、映射、归约)处理数据。创建Stream的方式包括Collection.stream()Arrays.stream()Stream.of()

Stream操作分为中间操作(如filter()map())和终端操作(如collect()forEach())。中间操作是惰性的,只有终端操作触发时才会执行。

常用Stream操作

filter(Predicate<T>)用于条件筛选,map(Function<T,R>)用于元素转换。例如,从列表中筛选偶数并平方:list.stream().filter(n -> n % 2 == 0).map(n -> n * n).collect(Collectors.toList())

归约操作如reduce()collect()用于聚合数据。Collectors类提供了多种收集器,如toList()joining()groupingBy()。统计单词频率可写为:words.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))

并行流与性能优化

Stream API支持并行处理,通过parallelStream()stream().parallel()启用。并行流利用多核处理器提高大数据集处理效率,但需注意线程安全和顺序依赖性。

性能优化建议包括:避免在流链中多次操作同一数据源,优先使用基本类型流(如IntStream)减少装箱开销,合理选择串行/并行模式。

方法引用

方法引用是Lambda的简写形式,通过::符号引用已有方法。包括静态方法引用(ClassName::staticMethod)、实例方法引用(instance::method)和构造函数引用(ClassName::new)。

例如,将字符串列表转为大写可写为:list.stream().map(String::toUpperCase).collect(Collectors.toList())。方法引用使代码更简洁且语义明确。

Optional类

Optional是Java 8引入的容器类,用于避免NullPointerException。它明确表示值可能不存在,强制开发者处理空值情况。常用方法包括ofNullable()orElse()ifPresent()

使用Optional可以更安全地进行链式调用,如user.flatMap(User::getAddress).map(Address::getCity).orElse("Unknown")。这取代了繁琐的if-else空值检查。

日期时间API

Java 8新增了java.time包,提供了不可变且线程安全的日期时间类。核心类包括LocalDateLocalTimeLocalDateTimeZonedDateTime。格式化使用DateTimeFormatter

新API解决了旧Date类的设计缺陷,例如计算两个日期之间的天数:ChronoUnit.DAYS.between(startDate, endDate)。时区处理也更直观,如ZonedDateTime.now(ZoneId.of("Asia/Shanghai"))

更多推荐