[英]How can split the emission of an RxJava Observable<Map<String, List<Integer>> into multiple ones?
我試圖將RxJava.Observable<Map<String, List<Integer>>
的排放拆分為多個RxJava.Observable<Map<String, List<Integer>>
。 每次發射都應包括原始列表的一個分區,所有這些都以原始順序排列。 保證每個列表具有相同的大小和(list.size() % partitionSize) == 0
。
例子:
{
"a": [0, 1, 2, 3, 4, 5, 6, 7, 8],
"b": [0, 1, 2, 3, 4, 5, 6, 7, 8]
}
到
// First emission
{
"a": [0,1,2],
"b": [0,1,2]
}
// Second emission
{
"a": [3,4,5],
"b": [3,4,5]
}
// Third emission
{
"a": [6,7,8],
"b": [6,7,8]
}
提前致謝!
我會使用streams
來完成這項工作。 一種方法是:
Map<String, List<Integer>> map = Map.of(
"a", List.of(0, 1, 2, 3, 4, 5, 6, 7, 8),
"b", List.of(0, 1, 2, 3, 4, 5, 6, 7, 8));
int size = map.values().stream().mapToInt(list -> list.size()).max().getAsInt();
int partitionSize = IntStream.iterate(2, i -> i + 1)
.limit(size)
.filter(i -> size % i == 0)
.findFirst()
.orElse(1);
int splitSize = Math.round(size / partitionSize);
List<Map<String, List<Integer>>> maps = IntStream.range(0, partitionSize)
.mapToObj(i -> map.entrySet().stream().collect(
Collectors.toMap(Map.Entry::getKey,
entry -> entry.getValue().subList(i * splitSize, (i + 1) * splitSize))))
.collect(Collectors.toList());
maps.forEach(System.out::println);
輸出:
{a=[0, 1, 2], b=[0, 1, 2]}
{a=[3, 4, 5], b=[3, 4, 5]}
{a=[6, 7, 8], b=[6, 7, 8]}
注意:我假設您不知道partitionSize
,所有Lists
既不為null
也不為空,並且都具有相同的大小和list.size() > 1
。
您應該為給定的參數partitionSize
buffer(size)
每個列表,然后從鍵集中的每個元素映射每個發出的緩沖列表。
fromIterable(map.entries).flatMap { entry ->
fromIterable(entry.value).buffer(Math.min(entry.value.size, partionSize))
}.flatMap {
fromIterable(map.keys).flatMap { key -> just(key to it) }
}.subscribe(::println)
輸出:
(a, [0, 1, 2])
(b, [0, 1, 2])
(a, [3, 4, 5])
(b, [3, 4, 5])
(a, [6, 7, 8])
(b, [6, 7, 8])
(a, [0, 1, 2])
(b, [0, 1, 2])
(a, [3, 4, 5])
(b, [3, 4, 5])
(a, [6, 7, 8])
(b, [6, 7, 8])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.