Фильтровать дублирующийся объект в реакторе Flux - PullRequest
0 голосов
/ 27 января 2019

Как я могу отфильтровать дубликат объекта моего собственного класса? Например: У меня есть класс со следующими атрибутами:

public class MyClass{
  private String id;
  private Date lastUpdate;
  //Getter and Setter are available
}

Теперь у меня есть Flux с большим количеством объектов MyClass. Они могут содержать один и тот же идентификатор, но иметь другую дату. Я хочу удалить все объекты с одинаковым идентификатором, но хочу сохранить последний обновленный объект.

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

В этой ситуации я хочу удалить первый элемент. У кого-нибудь есть идеи, как это сделать без блокировки?

1 Ответ

0 голосов
/ 27 января 2019

Мне приходит в голову одно решение:

  1. groupBy id
  2. затем reduce группыбросая старую запись
  3. наконец flatMap Mono с

код:

Flux.just(...)
    .groupBy(MyClass::getId)
    .flatMap(g -> g.reduce((a, b) -> a.getLastUpdate().compareTo(b.getLastUpdate()) > 0 ? a : b))
    .subscribe(System.out::println);

Например:

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);

напечатает:

MyClass{id='1', lastUpdate=2000-03-01}
MyClass{id='2', lastUpdate=2010-04-05}
MyClass{id='3', lastUpdate=-999999999-01-01}
...