我要完成的工作是在流的映射中运行一个方法,基于此方法,如果返回正确,则将其添加到成功列表中,该列表将放入集合的映射键中,如果失败,它将添加到失败列表中,该列表将包含在集合的值中:
<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
答案 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);
}
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]})