有人能告诉我如果某些条件匹配,如何从forEach循环中退出吗?我正在使用并行流。
下面是我的代码。
Map<int[], String[]> indexAndColNamePairs = depMapEntry.getKey();
Set<List<String>> dataRecords = depMapEntry.getValue();
for(Map.Entry<int[], String[]> indexAndColNamePair: indexAndColNamePairs.entrySet())
{
int refColIndex = indexAndColNamePair.getKey()[0];
Stream<List<String>> dataRecs = dataRecords.parallelStream();
dataRecs.forEach((row) -> {
if(referencingValue.equals(row.get(refColIndex)))
{
requiredColValueAndName.put(row.get(indexAndColNamePair.getKey()[1]),
indexAndColNamePair.getValue()[1]);
}
});
< code > if(referencing value . equals(row . get(refColIndex)))然后我将值插入到映射中,然后我需要退出。
根据我的理解,您希望仅对列表中的一个项目执行一个语句(必需的ColValueAndName.put
)。流.forEach
的用法与此用例无关。而是查找要首先执行语句然后执行的项。
Optional<List<String>> expectedRow = dataRecs.filter(row -> referencingValue.equals(row.get(refColIndex))).findFirst();
if(expectedRow.isPresent()) {
requiredColValueAndName.put(
expectedRow.get().get(indexAndColNamePair.getKey()[1]),
indexAndColNamePair.getValue()[1]);
}
你不能。从留档:
几乎在所有情况下,终端操作都是急切的,在返回之前完成它们对数据源的遍历和对管道的处理。只有终端操作iterator()和spliterator()不是;这些是作为“出口”提供的,以便在现有操作不足以完成任务的情况下,允许任意客户端控制的管道遍历。
您需要的是filter()和findFirst()或iterate()。
@MrinalKSamanta答案的更多功能变体:
indexAndColNamePairs.forEach((indices, colNames) -> {
int refColIndex = indices[0];
dataRecords.parallelStream()
.filter(row -> referencingValue.equals(row.get(refColIndex)))
.findFirst()
.ifPresent(row ->
requiredColValueAndName.put(row.get(indices[1]), colNames[1]));
});
请注意,如果不限制您只放入第一个匹配值(或者您最多期望一个匹配值),那么如果替换,您的性能可能会更好。findFirst()
和.findAny()
。