繁体   English   中英

如何从 Java 流中收集优先值?

[英]How collect prioritized values from java streams?

是否可以收集优先流,以便我区分某个对象并过滤另一个对象的最大值?

例子:

class Foo {
   private LocalDate date;
   private Integer cash;
}

List<Foo> myNewFoo = foos.stream().distinct(SOMETHING).collect(toList()) 
// distinct date, if more than one date of same value then choose max value of cash.

一种选择是:按cash降序对对象进行排序。 然后使用包装Set的方法来跟踪已经看到的日期并使用它过滤流(如果尚未包含指定的元素,则Set::add返回 true)。

public static void main(String[] args) {
    List<Foo> foos = new ArrayList<>();
    foos.add(new Foo(LocalDate.of(2021, 6, 1), 600));
    foos.add(new Foo(LocalDate.of(2021, 6, 3), 200));
    foos.add(new Foo(LocalDate.of(2021, 6, 4), 300));
    foos.add(new Foo(LocalDate.of(2021, 6, 2), 400));
    foos.add(new Foo(LocalDate.of(2021, 6, 3), 800));
    foos.add(new Foo(LocalDate.of(2021, 6, 1), 300));

    List<Foo> myNewFoo = foos.stream()
            .sorted(Comparator.comparing(Foo::getCash).reversed())
            .filter(distinctByDate())
            .collect(Collectors.toList());

    System.out.println(myNewFoo);
}

public static Predicate<Foo> distinctByDate() {
    Set<LocalDate> seen = new HashSet<>();
    return foo -> seen.add(foo.getDate());
}

结果:

[(2021-06-03,800), (2021-06-01,600), (2021-06-02,400), (2021-06-04,300)]

试试这个。

List<Foo> foos = List.of(
    new Foo(LocalDate.of(2021, 1, 1), 100),
    new Foo(LocalDate.of(2021, 1, 1), 200),
    new Foo(LocalDate.of(2021, 1, 2), 300),
    new Foo(LocalDate.of(2021, 1, 2), 400),
    new Foo(LocalDate.of(2021, 1, 3), 500));
List<Foo> myNewFoo = new ArrayList<>(foos.stream()
    .collect(Collectors.toMap(Foo::getDate, Function.identity(),
        (a, b) -> a.getCash() > b.getCash() ? a : b, TreeMap::new))
    .values());
System.out.println(myNewFoo);

输出:

[Foo(2021-01-01,200), Foo(2021-01-02,400), Foo(2021-01-03,500)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM