过滤 Flux Reactor 中的重复对象

MrI*_*ian 4 spring project-reactor spring-webflux

如何过滤我自己的类的重复对象?例如:我有一个具有以下属性的类:

public class MyClass{
  private String id;
  private Date lastUpdate;
  //Getter and Setter are available
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个包含很多 MyClass 对象的 Flux。它们可能包含相同的 ID,但日期不同。我想删除具有相同 id 的所有对象,但我想保留最后更新的对象。

Flux<MyClass> fluxMyContainer = Flux.just(new MyClass("1", "2017-01-02), 
  new MyClass("2", "2018-11-05"), new MyClass("1", "2018-05-04"));
Run Code Online (Sandbox Code Playgroud)

在这种情况下我想删除第一个元素。有谁知道如何在不阻塞的情况下做到这一点?

cac*_*co3 5

你可以:

  1. groupBy id
  2. reduce群组丢弃较旧的条目
  3. flatMap Monos
Flux.just(...)
    .groupBy(MyClass::getId)
    .flatMap(g -> g.reduce((a, b) -> a.getLastUpdate().compareTo(b.getLastUpdate()) > 0 ? a : b))
    .subscribe(System.out::println);
Run Code Online (Sandbox Code Playgroud)

例如:

Flux.just(
    new MyClass("1", LocalDate.of(1990, 2, 3)),
    new MyClass("1", LocalDate.of(2000, 3, 1)),
    new MyClass("2", LocalDate.of(1000, 2, 2)),
    new MyClass("2", LocalDate.of(2010, 4, 5)),
    new MyClass("2", LocalDate.MIN),
    new MyClass("3", LocalDate.MIN))
     .groupBy(MyClass::getId)
    .flatMap(g -> g.reduce((a, b) -> a.getLastUpdate().compareTo(b.getLastUpdate()) > 0 ? a : b))
    .subscribe(System.out::println);
Run Code Online (Sandbox Code Playgroud)

印刷:

MyClass{id='1', lastUpdate=2000-03-01}
MyClass{id='2', lastUpdate=2010-04-05}
MyClass{id='3', lastUpdate=-999999999-01-01}
Run Code Online (Sandbox Code Playgroud)