1

我有 Map [name:name1, type:type1, desc:desc1, ordinal:1] 流。如何将(使用 Groovy)转换/分组为 Map>: Map(type1: Map (neme:name1, desc:desc1, ordinal:1))。地图流

[name:productName,  type:IN, ordinal:1, description:desc]
[name:productName1,  type:IN, ordinal:2, description:desc]
[name:productName2,  type:OUT, ordinal:3, description:desc] 

我得到了: 地图:

IN: Map[
    [name:productName,  type:IN, ordinal:1, description:desc.], 
    [name:productName1,  type:IN, ordinal:2, description:desc.]]
OUT: Map[
    [name:productName2, type:OUT, ordinal:3, description:desc.]]
4

1 回答 1

0

您可以使用Stream.collect()with 方法Collectors.groupingBy { it.type }将所有元素收集为type元素列表的键和值的映射。考虑以下示例:

import java.util.stream.Collectors
import java.util.stream.Stream

def input = Stream.of(
    [name: 'productName', type: 'IN', ordinal: 1, description: 'desc'],
    [name: 'productName1', type: 'IN', ordinal: 2, description: 'desc'],
    [name: 'productName2', type: 'OUT', ordinal: 3, description: 'desc'],
)

def result = input.collect(Collectors.groupingBy { it.type })

result.each { println it }

输出:

IN=[{name=productName, type=IN, ordinal=1, description=desc}, {name=productName1, type=IN, ordinal=2, description=desc}]
OUT=[{name=productName2, type=OUT, ordinal=3, description=desc}]

或者,如果您的输入不是 aStream而是 a List,您可以使用具有相同效果的旧 Groovy Collection.groupBy()

def input2 = [[name: 'productName', type: 'IN', ordinal: 1, description: 'desc'],
              [name: 'productName1', type: 'IN', ordinal: 2, description: 'desc'],
              [name: 'productName2', type: 'OUT', ordinal: 3, description: 'desc']]

def result2 = input2.groupBy { it.type }

result2.each { println it }
于 2019-02-18T14:18:30.707 回答