gpt4 book ai didi

Java lambda - 具有两个独立条件的过滤器列表

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:09 24 4
gpt4 key购买 nike

我有一个包含 3 个对象的列表,按修改日期排序,例如:

{id=1, name=apple, type=fruit, modificationDate=2019-09-02}
{id=2, name=potato, type=vegetable, modificationDate=2019-06-12}
{id=3, name=dog, type=animal, modificationDate=2018-12-22}

我需要做的是以这种方式过滤这些项目:动物类型的对象将始终传递到新列表,但只有水果和蔬菜类型的项目(修改日期最近的那个)会被传递,所以结果列表如下:

{id=1, name=apple, type=fruit, modificationDate=2019-09-02}
{id=3, name=dog, type=animal, modificationDate=2018-12-22}

我尝试在流操作上组合 findFirst() 和 filter(),尽管如此,我只是设法使它一个接一个地工作,而不是作为“或”条件。

它适用于这样的代码:

    List<Item> g = list.stream().filter(f -> f.getType() == animal).collect(Collectors.toList());
Item h = list.stream().filter(f -> f.getType() != animal).findFirst().get();

g.add(h);

但这是一个极其丑陋的解决方案,所以我正在寻找更优雅的东西。

感谢任何帮助!

附言。该列表将始终只包含 3 个项目,1 个动物类型的项目应该保留,2 个不同类型的项目,按修改日期降序排列。

最佳答案

您可以使用 Stream.concat 连接 Item 的两个流,一个是 animal 类型,另一个是非动物类型。然后按照 modificationDate 的降序过滤和排序具有非动物类型 Item 的流,并通过放置 limit(1) 取第一个>.

最后,当 Stream 合并时,您再次对其进行排序,这次是在动物类型的 Item 流和非动物类型的 Item 流之间:

Comparator<Item> comp = Comparator.comparing(Item::getModificationDate, Comparator.reverseOrder());
List<Item> sorted = Stream.concat(list.stream()
.filter(f -> "animal".equals(f.getType())),
list.stream()
.filter(f -> !"animal".equals(f.getType()))
.sorted(comp)
.limit(1))
.sorted(comp)
.collect(Collectors.toList());

System.out.println(sorted);

我假设 modificationDate 是一个 LocalDateTime 字段,否则如果它是一个 String 则排序将按词法顺序进行。

关于Java lambda - 具有两个独立条件的过滤器列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57757318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com