【问题标题】:How to flat ImmutableList in ImmutableMap如何在 ImmutableMap 中扁平化 ImmutableList
【发布时间】:2019-12-13 02:12:06
【问题描述】:

说,我有一个名为 DomainObject 的类,

class DomainObject {

  private Long id;
  private String domainParam;
}

我正在接收对象列表,例如:

(id, domainType) = (1, "A") , (1, "B"), (3, "C"), (4, "A"), (1, "C")

毕竟,我想接收带有 Key(ImmutableList of Id) 和 Pair(Immutable list of domainParam) 的 ImmutableMap,例如:

1 [A, B, C]
3 [C]
4 [A]

现在我收到类似的东西:

{[1]=[DomainObject(id=1, domainParam=A), DomainObject(id=1, domainParam=B), DomainObject(id=1, domainParam=B)]}

这不是理想的解决方案。

到目前为止,我有一个类似的代码:


ImmutableMap<ImmutableList<Long>, ImmutableList<DomainObject>> groupedDomainObject(
      List<DomainObject> domainObjectList) {

    return domainObjectList.stream()
        .collect(
            Collectors.collectingAndThen(
                Collectors.groupingBy(
                    (domainObject) -> ImmutableList.of(domainObject.getId()),
                    ImmutableList.<DomainObject>toImmutableList()),
                ImmutableMap::copyOf));
}

我接近实现一个目标,但我如何才能从这部分平流价值:

ImmutableList.<DomainObject>toImmutableList()

接收唯一没有 DomainObject id 的 domainParam。

如果我能得到任何帮助,我将不胜感激。

【问题讨论】:

  • 附带问题:如果键只包含一个元素,为什么键应该是一个列表?
  • @Thomas 好点,这个列表完全没有必要。

标签: java java-8 java-stream java-11


【解决方案1】:
        ......
        .stream()
        .collect(Collectors.collectingAndThen(
            Collectors.groupingBy(
                x -> ImmutableList.of(x.getId()),
                Collectors.mapping(
                    DomainObject::getDomainParam,
                    ImmutableList.toImmutableList())),
            ImmutableMap::copyOf
        ));

【讨论】:

  • 我会添加一些文本来突出 Collectors.mapping() 的使用 :)
【解决方案2】:
ImmutableMap<Long, ImmutableList<String>> groupedDomainObject(
                List<DomainObject> domainObjectList) {

            return domainObjectList
                    .stream()
                    .collect(
                            Collectors.collectingAndThen(
                                Collectors.toMap(
                                    DomainObject::getId,
                                    obj -> ImmutableList.of(obj.domainParam),
                                    (a, b) -> ImmutableList.<String>builder().addAll(a).addAll(b).build()
                                ),
                                ImmutableMap::copyOf
                            )
                    );
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2018-05-14
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    相关资源
    最近更新 更多