如何在Java流上进行三向过滤/分组
我有一个如下所示的Java列表表示 数据的列表表示法 这里的部分表示。 下面是一个对象表示如何在Java流上进行三向过滤/分组,java,java-stream,Java,Java Stream,我有一个如下所示的Java列表表示 数据的列表表示法 这里的部分表示。 下面是一个对象表示 public Node { List<String> errorNames; List<String> SuccessNames; List<String> WarningNames; } 我想使用Java streams根据名称的类型将三种类型的名称分开,并将每个名称添加到各自的列表中 使用Stream.filter/Collect/
public Node {
List<String> errorNames;
List<String> SuccessNames;
List<String> WarningNames;
}
我想使用Java streams根据名称的类型将三种类型的名称分开,并将每个名称添加到各自的列表中
使用Stream.filter/Collect/Map任何其他方法分割列表的最佳方式是什么,以便在结束节点的->处,所有列表都有相应的数据 假设您的节点类实际上是这样的:
public class Node {
private String type;
private String name;
public Node(String type, String name) {
this.type = type;
this.name = name;
}
public String getType() {
return type;
}
public String getName() {
return name;
}
}
您可以将CollectorGroupingBy与CollectorMapping结合使用来创建一个映射,其中它们的键是类型,值是该类型每个节点的名称列表:
输出:
{Warning=[efc], Error=[xyz], none=[prq], Success=[abc, , xyz]}
你能解释一下collectCollectors.groupingByNode::getType,Collectors.mappingNode::getName,Collectors.toList@NikulPadhya Collectors.groupingBy在本例中只是按节点对象的类型对其进行分组,而Collectors.mapping会将节点更改为其名称。@Jcob,非常感谢您的回答,我能够使用您在原始答案中给出的提示使其工作。我想我正在寻找一种可以在流上执行或过滤的过滤方法。
var nodes = List.of(
new Node("Error", "xyz"), new Node("Success", "abc"),
new Node("none", "prq"), new Node("Success", ""),
new Node("Success", "xyz"), new Node("Warning", "efc")
);
var map = nodes.stream()
.collect(Collectors.groupingBy(Node::getType,
Collectors.mapping(Node::getName, Collectors.toList())));
System.out.println(map);
{Warning=[efc], Error=[xyz], none=[prq], Success=[abc, , xyz]}