为了账号安全,请及时绑定邮箱和手机立即绑定

在流中查找值,而不是最大值的几倍

在流中查找值,而不是最大值的几倍

忽然笑 2021-04-17 23:19:32
我想查找第一个日期早于实际最大日期的一年。我尝试使用流来执行此操作,但是我被卡住了。List<String> intervalIdList = new HashSet();intervalIdList.add("2018-01");intervalIdList.add("2017-12");intervalIdList.add("2017-11");intervalIdList.add("2017-10");...intervalIdList.add("2016-12"); // this is the value I want to findLocalDate localDateSet =                    intervalIdSet.stream()                            .map(s-> LocalDate.parse(s))                            .sorted()                            .filter(localDate -> localDate < max(localDate)) // something like max(localDate)                            .findFirst();我是否必须将最大过滤值写入流外部的变量?
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

似乎您正在寻找今天前一年的日期上限:


List<String> intervalIdList = new ArrayList<>();


intervalIdList.add("2018-01-01");

intervalIdList.add("2017-12-01");

intervalIdList.add("2017-11-01");

intervalIdList.add("2017-10-01");

intervalIdList.add("2016-12-01"); // this is the value I want to find


LocalDate localDateSet = intervalIdList.stream()

        .map(LocalDate::parse)

        .filter(ld -> ld.isBefore(LocalDate.now().minus(Period.of(1, 0, 0))))

        .max(Comparator.comparingLong(LocalDate::toEpochDay))

        .get();


System.out.println(localDateSet);

那打印 2016-12-01


请注意,我必须在日期字符串中添加天数,以匹配期望的默认格式LocalDate.parse。


由于使用了过滤器,因此显式检查可选变量以处理没有值与谓词匹配的情况可能更安全:


Optional<LocalDate> max = intervalIdList.stream()

        .map(LocalDate::parse)

        .filter(ld -> ld.isBefore(LocalDate.now().minus(Period.of(1, 0, 0))))

        .max(Comparator.comparingLong(LocalDate::toEpochDay));

并在读取最大值之前进行检查:


if(max.isPresent()) {

    LocalDate ld = max.get();

}


查看完整回答
反对 回复 2021-04-18
  • 2 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信