3 回答
TA贡献1860条经验 获得超9个赞
简单地说:不要。
不要投,也不要把事情搞得太复杂。
而是寻找安全的方法从count()
. 初学者请看这里:
int bar = Math.toIntExact(someLong);
例如。当您 100% 确定计算出的值总是适合 int 时,您只需避免放下可能抛出的 ArithmeticException 的捕获。而且你仍然有一种感觉,你不能在没有注意到的情况下“超越”。
但正如所说:不要将时间/精力投入到专门计算您自己的东西上,当您可以使用内置功能来计算事物并将它们转换为 int/Integer 时。请记住:您输入代码的每个字符都需要稍后阅读和理解。因此,随着时间的推移,即使是“20 个字符”也会增加。所以当你总是倾向于更短的解决方案时,只要它们易于阅读/理解。
TA贡献1798条经验 获得超7个赞
这是正确的方法。转换所有的不同的值,以1
使用Stream::mapToInt
-它产生IntStream
具有sum
/count
能的情况下直接映射来处理数值的方法流:
Integer count = s.filter(e -> (e.length() >= lb && e.length() <= ub && !e.contains(" "))) .map(String::toUpperCase) .distinct() .mapToInt(i -> 1) .sum();
无需映射到int
,您可以使用Stream::reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)
来获得完全相同的结果:
Integer count = s.filter(e -> (e.length() >= 2 && e.length() <= 10 && !e.contains(" "))) .map(String::toUpperCase) .distinct() .reduce(0, (a,b) -> a + 1, (a,b) -> a + b);
这个方法的接口有点复杂:
U identity
设置为 0 - 开始计数accumulator
((a,b) -> a + 1
) 将字符串转换为int
,每个字符串将被转换为 1 并添加到前一个结果 (0+1+1+1...)。combiner
组合两个连续值 ((a,b) -> a + b
) -值的总和,1
实际上是计数。
TA贡献1845条经验 获得超8个赞
如果您想在不使用内置 .count() 方法的情况下计算流中的元素,那么您可以将每个元素映射到一个 int 并通过对它们求和来减少。像这样的东西:
Integer count = s.mapToInt(i -> 1).reduce((a, b) -> a + b).orElse(0);
或者正如@Holger 在下面评论的那样在映射后使用 sum() 。
Integer count = s.mapToInt(i -> 1).sum();
添加回答
举报