[英]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.