在流中查找的值少于几倍,然后是最大值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在流中查找的值少于几倍,然后是最大值相关的知识,希望对你有一定的参考价值。

我想找到比实际最长日期长一年的第一个日期。我尝试用溪流做但我被卡住了。

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 find

LocalDate localDateSet =
                    intervalIdSet.stream()
                            .map(s-> LocalDate.parse(s))
                            .sorted()
                            .filter(localDate -> localDate < max(localDate)) // something like max(localDate)
                            .findFirst();

我是否必须将最大过滤值写入流外的变量?

答案

好像你正在寻找今天前一年的最长日期:

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();
}
另一答案

首先,你必须找到这样的实际最新日期,

LocalDate latestDate = intervalIdList.stream().map(s -> s.split("-"))
        .map(sp -> LocalDate.of(Integer.parseInt(sp[0]), Integer.parseInt(sp[1]), 1))
        .max(Comparator.comparingLong(LocalDate::toEpochDay)).orElse(null);

然后我们需要找到比最新日期早一年的所有日期,然后获取它们的最新日期。所以这段代码会这样做。

LocalDate firstDateOneYearOlder = intervalIdList.stream().map(s -> s.split("-"))
        .map(sp -> LocalDate.of(Integer.parseInt(sp[0]), Integer.parseInt(sp[1]), 1))
        .filter(d -> ChronoUnit.DAYS.between(d, latestDate) > 365)
        .max(Comparator.comparingLong(LocalDate::toEpochDay)).orElse(null);

另请注意,此解决方案使用相同格式的原始输入数据List,无需任何修改。

以上是关于在流中查找的值少于几倍,然后是最大值的主要内容,如果未能解决你的问题,请参考以下文章

java 按方法值在流中查找对象

解压缩到管道,然后在流中的文件上运行PDF信息

在流中组合音频和图像

使用 firebase auth 和 firestore 在流中调用未来

如何在流中使用来自另一个流数据的数据? (科特林流程)

在流中停止自己的音频