簡體   English   中英

使用流從內部對象分組Map屬性?

[英]Using streams to group Map attributes from inner objects?

我正在學習Java 8 - Java 11,我得到了一個代碼,我正在轉換為 我有以下課程:

class Resource {
   List<Capability> capabilities;
}

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

我有一個資源流,我想從兩個不同的命名空間(“a”,“b”)中提取所有的功能屬性到Map<Resource, Map<String, Object>> ,我確信它沒有重復鍵。

我做了很多嘗試使用map,flatMap但是有了這些,我無法保留主要資源對象的引用。 使用java9的新功能我可以進步,但我堅持下面的代碼,我能夠返回所有屬性,但在一個集合。 我還無法通過功能命名空間進行過濾,並將它們放在地圖中:

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]

您可以改為使用Collectors.toMap作為downstream

Map<Resource, Map<String, Object>> result = pResolved
        .stream()
        .collect(groupingBy(Function.identity(),
                flatMapping(resource -> resource.getCapabilities().stream(),
                        flatMapping(cap -> cap.getAttributes().entrySet().stream(),
                                toMap(Map.Entry::getKey, Map.Entry::getValue)))));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM