如何在Groovy中实现Java 8 Lambda功能,从日期列表提取最新日期
问题根因
- 类型不匹配:
parseDate方法返回值为LocalDate类型,但接收返回值的date1/date2/date3声明为String,存储这些值的List泛型又定义为旧版java.util.Date,三类完全不兼容,直接触发编译报错。 - 运行时异常风险:
parseDate传入空字符串时会返回null,直接加入集合参与比较会触发空指针;同时Stream.max()无有效元素时直接调用get()会抛出NoSuchElementException。
修正后兼容代码(支持Java Stream写法)
import java.time.LocalDate import java.util.Objects LocalDate date1 = parseDate("2020-09-12") LocalDate date2 = parseDate("") LocalDate date3 = parseDate("2019-01-12") List<LocalDate> l = new ArrayList<>() l.add(date1) l.add(date2) l.add(date3) // 先过滤空值,再取最大值,无有效日期时返回null避免异常 LocalDate maxDate = l.stream() .filter(Objects::nonNull) .max(LocalDate::compareTo) .orElse(null) println(maxDate) private LocalDate parseDate(String date) { try { return LocalDate.parse(date) } catch (Exception e) { return null } }
Groovy原生简化写法(更符合Groovy使用习惯)
Groovy集合自带常用操作方法,无需手动实现Stream逻辑:
import java.time.LocalDate // 定义日期转换闭包 def parseDate = { String date -> try { return LocalDate.parse(date) } catch (Exception ignored) { return null } } // 批量转换日期+过滤空值+取最大值,一行完成核心逻辑 def maxDate = ["2020-09-12", "", "2019-01-12"].collect(parseDate).findAll().max() println(maxDate)
内容的提问来源于stack exchange,提问作者Rishabh Jain
相关产品推荐
相关产品推荐

