如何从Java的8流更新Map <List <String>,List <String >>?

时间:2019-07-15 19:59:38

标签: java java-8 java-stream

我要完成的工作是在流的映射中运行一个方法,基于此方法,如果返回正确,则将其添加到成功列表中,该列表将放入集合的映射键中,如果失败,它将添加到失败列表中,该列表将包含在集合的值中:

  <td><b>Dont need it</b>I need this!!<br><b>Dont need it too:</b> I need 
  this too!!<br> <b>Text:</b> I need this<br></td>

实际上,集合的地图不是必需的,我唯一想要的就是在Stream的地图内已经更新了两个具有成功和失败列表,以避免必须在单个列表中进行进一步处理。

编辑:我正在使用流,因为实际上目标是使用parallelStream

2 个答案:

答案 0 :(得分:3)

您不需要Map,甚至不需要Stream。一个简单的for循环就可以完成工作,或者,如果您愿意,可以使用List::forEach

用于循环

for (String str : list) {
    String newS = serviceApi.getClearSongName(str);
    if (newS != null)
        success.add(newS);
    else
        failure.add(newS);
}

Foreach

list.forEach(str -> {
    String newS = serviceApi.getClearSongName(str);
    if (newS != null)
        success.add(newS);
    else
        failure.add(newS);
});

按分区

您还可以使用Collector::partitioningBy来返回Map<Boolean, List<String>>

Map<Boolean, List<String>> map = 
    list.stream()
        .collect(Collectors.partitioningBy(str -> serviceApi.getClearSongName(str) != null));

map.get(true)将返回在您的逻辑中将屁股分类为success的那些

答案 1 :(得分:0)

我猜您需要流式传输列表,调用api并分别收集成功和失败的信息。下面是一个有关如何完成此操作的小片段(在groovy中不是Java)

def a = [1,2,3,4,5,6,7,8,9]
Map<Boolean,List> x = a.stream().map{it -> new Tuple2<Boolean,Integer>(it>5, it)}.collect(Collectors.partitioningBy{i -> i[0]})
println(x)

Collectors.partitionBy根据谓词(条件)将流分成两组。如果需要分成多个组,请使用Collectors.groupingBy()方法。以下链接提供了有关此特定用例的更多详细信息 Can you split a stream into two streams?

请注意“无法在无限流上运行”警告

您的代码如下所示

Map<Boolean,List> masterLista = list.stream()
.map(l -> {
                String newS=serviceApi.getClearSongName(l)
                return new Tuple2<Boolean,String>(newS!=null, l)

}).collect(Collectors.partitioningBy{i -> i[0]})