使用流将列表按值转换为另一个列表

时间:2016-10-23 00:12:54

标签: java-8 java-stream

我有以下代码可以正常工作。我的目标是计算上下节点的数量

 Map<Boolean, Long> counting = nodes.stream()
            .collect(Collectors.groupingBy(ClusterNode::IsUp,Collectors.counting()));

 List<DataPoint> dps = counting.keySet().stream()
            .map(k -> new DataPoint(timestamp, counting.get(k).toString(), cluster, k.toString()))
            .collect(Collectors.toList());

想知道是否有更好的方法可以使用流来完成此操作。它可以组合成一个操作吗?

1 个答案:

答案 0 :(得分:1)

您可以将操作编写为一个语句,但从技术上讲,它包含两个Stream操作:

List<DataPoint> dps = nodes.stream()
 .collect(Collectors.partitioningBy(ClusterNode::IsUp, Collectors.counting()))
 .entrySet().stream()
 .map(e->new DataPoint(timestamp, e.getValue().toString(), cluster, e.getKey().toString()))
 .collect(Collectors.toList());

您可以将第二个操作合并到收集器中作为完成操作,例如通过collectingAndThen,您也可以通过两次查找已知密钥truefalse来替换第二个Stream操作,然后,它确实是一个Stream操作,但是,对于no实际利益。