簡體   English   中英

如何拆分 RxJava Observable 的發射<Map<String, List<Integer> &gt; 分成多個?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM