使用 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条件(分支)语句