簡體   English   中英

如果在 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 中找到任何匹配項,則將數據設置為列表中第一個 object 的內部對象

[英]If any match found in the stream set data to innerobject of the first object in a list

GroupNode Class:

@Data
public class GroupNode {
    private String groupName;
    private List<PolicyNode> policies;
    private String eventId;
}

策略節點 Class:

@Data
public class PolicyNode {
    private String policyName;
    private String eventTime;
    private String eventId;
}

這里我想要的是如果 groupNode 的 eventId 與 policyNode 的 eventId 匹配,那么我想在 groupNode 中設置 policyNode 詳細信息。

我試過的代碼。

List<GroupNode> groupWithPolicy = groupWithoutPolicy.stream()
    .filter(gwp->groupPolicyNodeList.stream().anyMatch(gwop->gwop.getEventId().equals(gwp.getEventId())))
                .collect(Collectors.toList());

我知道我沒有在這里設置任何屬性,但我不知道如何將這些屬性設置為組節點:/

這是我想要的示例響應:

"groups": [
            {
                "groupName": "My group",
                "policies": [
                    {
                        "policyName": "Inno-Test-Cust-Man-Policy",
                        "eventId": "67e3426e-fd42-483f-9d90-8f7d15646f6a",
                    },
                    {
                        "policyName": "Inno-Test-Cust-Man-Policy",
                        "eventId": "67e3426e-fd42-483f-9d90-8f7d15646f6a",
                    }
                ],
                "eventId": "2d72752d-8f28-4549-9c0c-986ac98873cf"
            }
        ]
    }

我從 output 上面刪除了很多數據,這里的 eventId 不匹配。 所以我列出了所有沒有附加政策的組列表。 和所有政策清單。 現在基於 eventId 我想向組添加策略。

例如,您可以這樣做:

public static void main(String[] args) {
    List<GroupNode> groupWithPolicy = groupWithoutPolicy.stream()
            .map(s -> setPolicyNodeList(s, externalPolicyList))
            .collect(Collectors.toList());

}

private static GroupNode setPolicyNodeList(GroupNode groupNode, List<PolicyNode> policyNodeList) {
    groupNode.setPolicyNode (
            policyNodeList.stream()
            .filter(s-> s.getEventId.equals(groupNode.getEventId))
            .collect(Collectors.toList())
    );

    return groupNode;
}

它易於閱讀和理解。

此外,您可以進行分組並從 O(n*n) 中逃脫:

    Map<String, List<PolicyNode>> collect = policyNodeList.stream()
            .collect(groupingBy(s -> s.getEventId));
    List<GroupNode> groupWithPolicy = groupWithoutPolicy.stream()
            .peek(s -> s.setPolicies(collect.get(s.getEventId())))
            .collect(Collectors.toList());

似乎您需要在沒有策略的情況下更新現有組,可以按如下方式完成:

List<PolicyNode> policies = buildPolicyList(); // aka groupNodePolicyList
List<GroupNode> groups = buildInitialGroupList(); // aka groupWithoutPolicy

groups.forEach(group ->
     group.setPolicies(
         policies.stream()
                 .filter(p -> group.getEventId().equals(p.getEventId()))
                 .collect(Collectors.toList())
));

之后,可以過濾掉策略列表為空的組:

List<GroupNode> groupsWithoutPolicy = groups
        .stream()
        .filter(g -> g.getPolicies().isEmpty())
        .collect(Collectors.toList());

另一種方法可能是從policies中准備<String, List<PolicyNode>>的 map,以便在組節點中設置策略列表時將其用作緩存:

Map<String, List<PolicyNode>> mapEventPolicy = policies
        .stream()
        .collect(Collectors.groupingBy(Policy::getEventId));

然后可以通過過濾和重新收集來構建具有策略的組列表,而不影響初始組列表:

List<GroupNode> groupsWithPolicy = groups
        .stream()
        .filter(group -> mapEventPolicy.containsKey(group.getEventId()))
        .map(group -> new GroupNode( // use/add appropriate all-args constructor
            group.getGroupName(), 
            new ArrayList<>(mapEventPolicy.get(group.getEventId())),
            group.getEventId()
        ))
        .collect(Collectors.toList());

注意:每組應提供一份政策清單。

暫無
暫無

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

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