给出以下数据结构Data
和Flux<Data>
,这是基于某些属性实现将列表分为一系列的惯用方式:
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.function.Predicate;
class Scratch {
private static class Data {
private Integer key;
private String value;
public Data(Integer key, String value) {
this.key = key;
this.value = value;
}
public Integer getKey() {
return key;
}
public String getValue() {
return value;
}
public static Data of(Integer key, String value) {
return new Data(key, value);
}
@Override
public String toString() {
return value;
}
}
public static void main(String[] args) {
Flux<Data> test = Flux.just(
Data.of(1, "Hello"),
Data.of(1, "world"),
Data.of(2, "How"),
Data.of(2, "are"),
Data.of(2, "you"),
Data.of(3, "Bye"));
test.bufferUntil(new Predicate<Data>() {
Integer prev = null;
@Override
public boolean test(Data next) {
boolean collect = prev != null && !Objects.equals(prev, next.getKey());
prev = next.getKey();
return collect;
}
}, true).subscribe(e -> System.out.println(e.toString()));
}
}
输出:
[Hello, world]
[How, are, you]
[Bye]
我知道Flux上的groupBy函数,但这又给了我一个Flux,而不是列表。我已经在上面描述了当前的解决方案,但是感觉不是100%惯用的,因为我不得不使用匿名类而不是lambda。我本可以在lambda之外使用lambda和AtomicReference,但这也不是100%正确的。有什么建议吗?
答案 0 :(得分:2)
这是使用groupBy运算符的解决方案。我已按通用密钥对数据进行了分组。 groupBy运算符为我提供了GroupedFlux的通量。 GroupedFlux是Flux的子类,因此我应用flatMap并使用collectList运算符将单个groupedFlux转换为List<Data>
。这样,我得到一个Flux<List<Data>>
,然后根据您的要求订阅并打印。
test.groupBy(Data::getKey)
.flatMap(Flux::collectList)
.subscribe(listOfStringsHavingDataWithSameKey -> System.out.println(listOfStringsHavingDataWithSameKey.toString()));
请检查Flux和GroupedFlux的文档。
答案 1 :(得分:1)
您还可以使用collectMultimap
来拥有Map<K, Collection<T>
。在这种情况下,collectMultimap
将返回:Mono<Map<Integer,Collection<Data>>>
:
test.collectMultimap( Data::getKey )
.subscribe( dataByKey -> System.out.println( dataByKey.toString() ) );
输出:
{1=[Hello, world], 2=[How, are, you], 3=[Bye]}