当前位置: 首页 > 知识库问答 >
问题:

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

姬成荫
2023-03-14

有人能告诉我如果某些条件匹配,如何从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个答案

康锦
2023-03-14

@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()

吴驰
2023-03-14

你不能。从留档:

几乎在所有情况下,终端操作都是急切的,在返回之前完成它们对数据源的遍历和对管道的处理。只有终端操作iterator()和spliterator()不是;这些是作为“出口”提供的,以便在现有操作不足以完成任务的情况下,允许任意客户端控制的管道遍历。

您需要的是filter()和findFirst()或iterate()。

郎雅昶
2023-03-14

根据我的理解,您希望仅对列表中的一个项目执行一个语句(必需的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]);
    
}
 类似资料:
  • 我有三张桌子: Person表以ID作为主键存储基本的Person明细此人可以拥有关系(父亲/母亲等),这些关系保存在Relationship表中,但是他们的用户是在Person表中创建的(例如Person表中的ID=2,3),这样我们就知道2,3与用户1(carry)相关。我们还有第三个表-地址,它存储用户ID方面的地址。(用户和他的相关人员,他们也是用户)我想知道在SQL中是否存在一个用户或他

  • 问题内容: public void test(){ String x; List list=Arrays.asList(“a”,”b”,”c”,”d”); 1,像上面的代码一样,我想在foreach块旁边设置一个变量的值,行得通吗? 2.为什么呢? 3,而foreach迭代器是有序的还是无序的? 4,我认为lamdas foreach块对于迭代器来说很酷而且很简单,但这确实是一件很复杂的事情,而不

  • 问题内容: 我可以用来匹配所有标点符号(包括下划线)。 我想严格 排除 一个单词内的所有撇号。为此,我正在使用 但是,我不能让它们一起工作以匹配所有标点符号,但严格来说单词内的撇号除外。 我应该使用什么? 例子: 这应该不匹配。 这应该匹配。 这些应该匹配。 问题答案: 您可以在此处组合三个条件。 匹配除撇号外的所有标点符号使用 匹配所有撇号,后面没有字母。 匹配所有不带字母的撇号。 正则表达式:

  • 我正在使用Android Studio和Google Drive,这会使隐藏的系统文件可见(例如图标和桌面ini),导致错误,如本文所述。我希望指示gradle 2.14忽略它们,而不是运行脚本来删除这些文件。 为了找出如何排除文件,我在目录和中创建了名为“excludeme.txt”的文件。我尝试对项目中的两个文件进行各种修改,但没有成功排除该文件。 具体来说,我对的文件进行了以下修改: 我还将

  • 我试图添加if-else语句来更改文本的颜色。然而,它并不能很好地工作。我希望只把40分以下的分数改成红色,但我不知道为什么我的文字都改成了红色。我能知道我犯了什么错误吗? 在if-else语句中,我编写了当标记低于40时更改文本颜色的代码。但是,它会将所有文本更改为红色。

  • 我需要能够在如下文件中找到特定值(例如): 4D 54 68 64 00 00 00 06 00 01 00 01 00 C0 4D 54 72 6B 00 00 00 00 00 00 31 00 90 60 40 81 40 80 60 00 90 62 40 81 40 80 62 40 00 90 64 40 81 40 80 64 40 00 90 62 40 81 40 62 40 0