提问者:小点点

在java 8中,如果某些条件匹配,如何从forEach中退出


有人能告诉我如果某些条件匹配,如何从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)))然后我将值插入到映射中,然后我需要退出。


共3个答案

匿名用户

根据我的理解,您希望仅对列表中的一个项目执行一个语句(必需的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()