为了账号安全,请及时绑定邮箱和手机立即绑定

计算流中的元素并返回 Integer insted of long

计算流中的元素并返回 Integer insted of long

泛舟湖上清波郎朗 2021-08-06 10:47:17
我需要计算流中的元素并将其分配给一个整数而不进行转换。.count() 确实返回很长时间想了想,.collect(Collectors.reducing(..))却想不通。我觉得有些简单的东西我不明白。我的尝试:Stream<String> s = Stream.of("Hallo ", "Test", "String");Integer count = s.filter(e -> (e.length() >= lb && e.length() <= ub && !e.contains(" ")))                 .map(e -> e.toUpperCase())                 .distinct()                 .collect(Collectors.reducing(0, e -> 1, Integer::sum)));System.out.println(count);
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

简单地说:不要。

不要投,也不要把事情搞得太复杂。

而是寻找安全的方法从count(). 初学者请看这里

int bar = Math.toIntExact(someLong);

例如。当您 100% 确定计算出的值总是适合 int 时,您只需避免放下可能抛出的 ArithmeticException 的捕获。而且你仍然有一种感觉,你不能在没有注意到的情况下“超越”。

但正如所说:不要将时间/精力投入到专门计算您自己的东西上,当您可以使用内置功能来计算事物并将它们转换为 int/Integer 时。请记住:您输入代码的每个字符都需要稍后阅读和理解。因此,随着时间的推移,即使是“20 个字符”也会增加。所以当你总是倾向于更短的解决方案时,只要它们易于阅读/理解。


查看完整回答
反对 回复 2021-08-06
?
元芳怎么了

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实际上是计数。


查看完整回答
反对 回复 2021-08-06
?
精慕HU

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


查看完整回答
反对 回复 2021-08-06
  • 3 回答
  • 0 关注
  • 230 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信