gpt4 book ai didi

java - 在嵌套 Map 中使用 groupingBy,但收集到不同类型的对象

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:21:46 24 4
gpt4 key购买 nike

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

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

但是,我想更改此代码,以便在按 SomeClassA 字段分组后,内部集合属于 SomeClassB。例如,如果类如下所示:

假设他们都有所有的参数构造函数

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

class SomeClassB {
T someData;
String someId;
}

某处有一个方法:

public static Collection<SomeClassB> getSomeClassBsFromSomeClassA(SomeClassA someA) {
List<Some List of Class B> listOfB = someMethod(someA);
return listOfB; // calls something using someClassA, gets a list of SomeClassB
}

我想将 SomeClass B 的结果列表展平为

Map<String, Map<String, ImmutableList<SomeClassB>>> someMap = 
someListOfClassA.stream()
.filter(...)
. // not sure how to group by SomeClassA fields but result in a list of SomeClassB since one SomeClassA can result in multiple SomeClassB

我不确定这如何适合上面的代码。我怎样才能将一堆基于 SomeClassB 的列表收集到一个包含 SomeClassA 的所有值的列表中?如果单个 ClassA 映射到单个 ClassB,我知道如何使用 Collectors.mapping 让它工作,但由于每个 ClassA 导致多个 ClassB,我不确定如何让它工作。

如有任何想法,我们将不胜感激。谢谢!

最佳答案

像这样的自定义收集器:

private static Collector<Collection<SomeClassB>, ?, ImmutableList<SomeClassB>>
flatMapToImmutableList() {
return Collectors.collectingAndThen(Collectors.toList(),
listOfCollectionsOfB ->
listOfCollectionsOfB.stream()
.flatMap(Collection::stream)
.collect(GuavaCollectors.toImmutableList()));
}

你可以实现你所追求的:

Map<String, Map<String, List<SomeClassB>>> someMap =
someListOfClassA.stream()
.filter(...)
.collect(Collectors.groupingBy(SomeClassA::getSomeCriteriaA,
Collectors.groupingBy(SomeClassA::getSomeCriteriaB,
Collectors.mapping(a -> getSomeClassBsFromSomeClassA(a),
flatMapToImmutableList()))));

关于java - 在嵌套 Map 中使用 groupingBy,但收集到不同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44035738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com