Java 在流中查找比最大值少几倍的值
我想找到比实际最长日期早一年的第一个日期。我试着用溪流来做,但我被卡住了Java 在流中查找比最大值少几倍的值,java,java-8,java-stream,Java,Java 8,Java Stream,我想找到比实际最长日期早一年的第一个日期。我试着用溪流来做,但我被卡住了 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"); //
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 intervalIdList=new HashSet();
有效期间列表添加(“2018-01”);
区间列表添加(“2017-12”);
区间列表添加(“2017-11”);
区间列表添加(“2017-10”);
...
区间列表。添加(“2016-12”);//这就是我想要找到的价值
LocalDate localDateSet=
intervalIdSet.stream()
.map->LocalDate.parse
.已排序()
.filter(localDate->localDate
我是否必须将最大过滤值写入流之外的变量 您似乎在寻找比今天早一年的最长日期:
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);
并在读取最大值之前检查:
if(max.isPresent()) {
LocalDate ld = max.get();
}
似乎您正在寻找比今天早1年的最长日期:
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);
并在读取最大值之前检查:
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);
另外请注意,此解决方案使用相同格式的原始输入数据
列表
,无需任何修改。首先,您必须找到实际的最新日期,如下所示
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);
另外请注意,此解决方案使用相同格式的原始输入数据
列表
,没有任何修改。您只是在流中查找最长日期吗?Actulal max没有意义^^List intervalIdList=new HashSet()代码>这对于开始…流两次非常有意义-找到max,从中筛选max@azro这正是我投票关闭此项的原因…您是否只是在寻找流中的最长日期?Actulal max没有意义^^List intervalIdList=new HashSet()代码>这对于开始…流两次非常有意义-找到max,从中筛选max@azro正是因为这个原因,我投票关闭了这个……是的,我是这样做的,但我认为有一个机会在其中一个stream@Adriano这是一条小溪。请看第一个代码段,它直接调用.get()
。你可能想把它改成.orElse
…是的,我是这样做的,但我认为有机会用一种方式来做stream@Adriano这是一条小溪。请看第一个代码段,它直接调用.get()
。您可能需要将其更改为.orElse
。。。