【问题标题】:Creating a nested map using groupBy but collecting into a different type of Object使用 groupBy 创建嵌套地图,但收集到不同类型的对象中
【发布时间】:2017-04-12 22:42:30
【问题描述】:

所以我有这个“有效”的代码(为简单起见替换了一些名称):

 Map<String, Map<String, ImmutableList<SomeClassA>>> someMap =
      someListOfClassA.stream()
      .filter(...)
      .collect(Collectors.groupingBy(SomeClassA::someCriteriaA,
            Collectors.groupingBy(SomeClassA::someCriteriaB, GuavaCollectors.toImmutableList()
            )
      ));

但是,我想更改此代码,以便在对 SomeClassA 进行分组后创建新的 SomeClassB。所以如果类看起来像这样:

例如,(假设它们都具有所有 args 构造

class SomeClassA { 
    String someCriteriaA;
    String someCriteriaB;
    T someData;
    String someId;
}

class SomeClassB {
    T someData;
    String someId; 
}

我希望能够改为创建

Map<String, Map<String, ImmutableList<SomeClassB>>> someMap = 
    someListOfClassA.stream()
    .filter(...)
    . // not sure how to group by SomeClassA values while creating new SomeClassB instances

我不确定这是否适合上面的代码。如何根据 SomeClassA 的值构造 SomeClassB 的实例?

任何想法将不胜感激。谢谢!

【问题讨论】:

  • Collectors.mapping(SomeClassB::new, GuavaCollectors.toImmutableList())
  • @4castle - 你能提供一些关于它如何工作的细节吗?如何从分组的 SomeClassA 对象中获取值到新创建的 SomeClassB 实例中?
  • SomeClassB::new 可以替换为将SomeClassA 实例转换为SomeClassB 的任何lambda 或方法引用。 Collectors.mapping 只是在下游收集器中收集输出之前通过函数运行值。

标签: java java-8 java-stream


【解决方案1】:

像这样使用收集器:

Map<String, Map<String, ImmutableList<SomeClassB>>> someMap = 
  someListOfClassA
    .stream()
    .filter(...)
    .collect(Collectors.groupingBy(SomeClassA::someCriteriaA,
               Collectors.groupingBy(SomeClassA::someCriteriaB,
                 Collectors.mapping(someClassA -> new SomeClassB(), GuavaCollectors.toImmutableList()))));

而您可以将someClassA -&gt; new SomeClassB() 替换为您的代码,以将SomeClassA 的实例转换为SomeClassB 的实例。

Collectors.mapping() 将在收集发生之前简单地应用给定的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多