使用 If 条件遍历 ArrayList 并使用流 api 返回布尔标志 [重复]

Posted

技术标签:

【中文标题】使用 If 条件遍历 ArrayList 并使用流 api 返回布尔标志 [重复]【英文标题】:Iterate through ArrayList with If condition and return boolean flag with stream api [duplicate] 【发布时间】:2019-01-29 21:32:52 【问题描述】:

我正在努力让自己更熟悉 Java 8 Stream api。 目前我想翻译类似流的东西,但似乎我还不够舒服,因为我不知道该怎么做。

boolean isTrue = false;

for (Integer integer : intList) 
    if (integer > 10) 
        isTrue = true;
        break;
    

【问题讨论】:

【参考方案1】:

您只关心列表中的至少一个输入是否大于 10,即anyMatch

boolean isTrue = intList.stream()
                        .anyMatch(x -> x > 10);

【讨论】:

会导致 NPE 吗? @VdeX 我需要您的问题的一些背景信息,请 抱歉intList.stream()会导致NPE,不是吗? @VdeX finally :) 为什么不从一开始就说清楚呢? Optional.ofNullable(intList).orElse(Collections.emptyList()).anyMatch(x -> x > 10) 很抱歉,是的,我太抽象了:(【参考方案2】:

您迭代了一个整数列表。所以使用Collection.stream()

你比较数值。所以使用Stream.mapToInt()int 一起工作,而不是Integer,这样效率更高。在这里它并没有改变很多东西,但是如果你改变流来做一些其他的数值运算,你已经使用了正确的方法。

只要满足条件,您就会对布尔值(结果)进行赋值。否则我认为是错误的。所以使用Stream.anyMatch(Predicate)

所以这对应:

boolean result =
intList.stream()
       .mapToInt(i-> i)
       .anyMatch(i-> i > 10);

【讨论】:

为什么mapToInt() 使用原始int 而不是对象Integer?没有它,Integer 无论如何都会在i -> i > 10 被拆箱到int(就像在 Eugene 的答案中一样)。在您的回答中,它仍然会在 i -> i 处自动拆箱。 @Kevin Cruijssen 对。但是假设您稍后修改流以进行其他处理,可能会发生一些装箱操作。在这里使用mapToInt() 更多的是一种编写健壮代码的方法。 嗯,没想到。在这种情况下我仍然觉得它有点多余,但我现在可以理解你背后的原因了。

以上是关于使用 If 条件遍历 ArrayList 并使用流 api 返回布尔标志 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

go语言学习笔记 — 基础 — 控制流:if条件(分支)语句

JAVA编程题目: ArrayList存储任意三个字符串,并遍历(迭代器遍历)

在 Java 中从 ArrayList 中删除对象

ArrayList源代码中容量检查IF条件的用途是什么

c# arraylist遍历删除

Rust 常见编程概念------控制流