因此,我有这段代码“有效”(为简单起见,替换了一些名称):

 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的实例?

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

最佳答案

像这样使用收集器:

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 -> new SomeClassB(),以将SomeClassA的实例转换为SomeClassB的实例。

Collectors.mapping()将仅在收集发生之前应用给定功能。

10-01 14:29