我试图弄清楚是否有办法将其转换为java 8流/过滤器表达式。
List<IChangelistSummary> bugChanges ........
for (IChangelistSummary bugChange : bugChanges)
{
IChangelist changeInfo = server.getChangelist(bugChange.getId());
List<IFileSpec> fileSpecs = changeInfo.getFiles(true);
boolean canAccept = false;
for (IFileSpec fileSpec : fileSpecs)
{
if (fileSpec.getDepotPathString().contains("release1234"))
{
canAccept = true;
break;
}
}
if (canAccept)
{
System.out.println("bugChange="+ bugChange.getId() + "=="+ bugChange.getDescription());
}
}
我已经使用java 8 stream / filter来获取&#39; bugChanges&#39;的实例,但我无法弄清楚如何将以下代码转换为java 8.
感谢。
答案 0 :(得分:1)
有2个for-loops
和2个if
条件。它可能被外流和内流取代。
Option<IChangelistSummary> summary = bugChanges.stream()
.filter(bugChange -> server
.getChangelist(bugChange.getId())
.getFiles(true)
.stream()
.anyMatch( spec ->
spec.getDepotPathString()
.contains("release1234")
)
)
.forEach(bug ->
System.out.println(
"bugChange="+ bug.getId() + "=="+ bug.getDescription())
)
);
这看起来有点难看。在外部流中,我们检查bugChange
个元素,只留下满足过滤器Predicate
的元素。现在,在内部流中,我们验证与当前bug id
关联的文件是否包含"release1234"
字符串。最后我们打印结果。
答案 1 :(得分:0)
您需要使用flatMap
bugChanges.stream().flatMap(bugChange -> Stream.of(server.getChangelist(bugChange.getId()))
.map(changeInfo -> changeInfo.getFiles(true))
.filter(fsList -> fsList.stream().anyMatch(fs -> fs.getDepotPathString().contains("release1234")))
.map(fs -> bugChange)).forEach(bugChange -> System.out.println("bugChange="+ bugChange.getId() + "=="+ bugChange.getDescription()));