![](/img/trans.png)
[英]Filtered Stream with any match on two objects set a value of one object to the value of another 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.