java - 使用流对内部对象的 Map 属性进行分组?

标签 java collections java-8 java-stream java-11

我正在学习 Java 8 - Java 11,我得到了一个要转换为 的代码.我有以下类(class):

class Resource {
   List<Capability> capabilities;
}

class Capability {
   String namespace;
   Map<String, Object> attributes;
}

我有一个资源流,我想将其所有功能属性从两个不同的命名空间(“a”、“b”)提取到 Map<Resource, Map<String, Object>>我确定没有重复的键。

我使用 map、flatMap 做了很多尝试,但是对于这些,我无法保留主要资源对象的引用。使用 java9 的新功能我可以进步,但我被困在下面的代码中,在那里我能够返回所有属性,但在一个集合中。 我还不能按功能命名空间进行过滤,也无法将它们放入 map 中:

Map<Resource, Set<Object>> result = pResolved.stream()
    .collect(groupingBy(t -> t, flatMapping(
            resource -> resource.getCapabilities(null).stream(),
            flatMapping(
                    cap -> cap.getAttributes().entrySet().stream(),
                    toSet()))));

看来我走的路是对的。

最佳答案

有一种方法只使用 方法:

Map<String, Set<Object>> result = pResolved.stream()                        
    .map(Resource::getCapabilities)                         // Stream<List<Capability>>
    .flatMap(List::stream)                                  // Stream<Capability>
    .collect(Collectors.toMap(                              // Map<String, Set<Object>>
        c -> c.getNamespace(),                              // Key: String (namespace)
        i -> new HashSet<>(i.getAttributes().values())));   // Value: Set of Map values

假设样本输入是:

Resource [capabilities=[
    Capability [namespace=a, attributes={a1=aa1, a2=aa2, a3=aa3}]]]
Resource [capabilities=[
    Capability [namespace=b, attributes={b2=bb2, b3=bb3, b1=bb1}], 
    Capability [namespace=c, attributes={c3=cc3, c1=cc1, c2=cc2}]]]

那么上面的代码会导致:

a: [aa1, aa3, aa2]
b: [bb1, bb3, bb2]
c: [cc1, cc3, cc2]

关于java - 使用流对内部对象的 Map 属性进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54255362/

相关文章:

java - 在 android 中更新 sqlite 数据库的首选方法

java - 如何为域轴和范围轴设置相同的比例 JFreeChart

java - 将 Excel 单元格内容读取为 Java InputStream

java - Spring Boot JSON 空值序列化

java - 无法从 Json 字符串创建对象列表

java - 如何用ant更改系统环境

c# - 这可能使用泛型吗? C#

java - Java 中是否有 STL-Multiset 等效容器?

java - 从两个列表中删除重复项

Java 8 流。在 lambda 表达式中向客户端方法抛出异常