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

我需要计算流中的元素并将其分配给一个整数而不进行转换。


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


泛舟湖上清波郎朗
浏览 231回答 3
3回答

慕码人2483693

简单地说:不要。不要投,也不要把事情搞得太复杂。而是寻找安全的方法从count().&nbsp;初学者请看这里:int&nbsp;bar&nbsp;=&nbsp;Math.toIntExact(someLong);例如。当您 100% 确定计算出的值总是适合 int 时,您只需避免放下可能抛出的 ArithmeticException 的捕获。而且你仍然有一种感觉,你不能在没有注意到的情况下“超越”。但正如所说:不要将时间/精力投入到专门计算您自己的东西上,当您可以使用内置功能来计算事物并将它们转换为 int/Integer 时。请记住:您输入代码的每个字符都需要稍后阅读和理解。因此,随着时间的推移,即使是“20 个字符”也会增加。所以当你总是倾向于更短的解决方案时,只要它们易于阅读/理解。

元芳怎么了

这是正确的方法。转换所有的不同的值,以1使用Stream::mapToInt-它产生IntStream具有sum/count&nbsp;能的情况下直接映射来处理数值的方法流:Integer&nbsp;count&nbsp;=&nbsp;s.filter(e&nbsp;->&nbsp;(e.length()&nbsp;>=&nbsp;lb&nbsp;&&&nbsp;e.length()&nbsp;<=&nbsp;ub&nbsp;&&&nbsp;!e.contains("&nbsp;"))) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(String::toUpperCase) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.distinct() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mapToInt(i&nbsp;->&nbsp;1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sum();无需映射到int,您可以使用Stream::reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)来获得完全相同的结果:Integer&nbsp;count&nbsp;=&nbsp;s.filter(e&nbsp;->&nbsp;(e.length()&nbsp;>=&nbsp;2&nbsp;&&&nbsp;e.length()&nbsp;<=&nbsp;10&nbsp;&&&nbsp;!e.contains("&nbsp;"))) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(String::toUpperCase) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.distinct() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.reduce(0,&nbsp;(a,b)&nbsp;->&nbsp;a&nbsp;+&nbsp;1,&nbsp;(a,b)&nbsp;->&nbsp;a&nbsp;+&nbsp;b);这个方法的接口有点复杂:U identity&nbsp;设置为 0 - 开始计数accumulator(&nbsp;(a,b) -> a + 1) 将字符串转换为int,每个字符串将被转换为 1 并添加到前一个结果 (0+1+1+1...)。combiner组合两个连续值 (&nbsp;(a,b) -> a + b) -值的总和,1实际上是计数。

精慕HU

如果您想在不使用内置 .count() 方法的情况下计算流中的元素,那么您可以将每个元素映射到一个 int 并通过对它们求和来减少。像这样的东西:Integer&nbsp;count&nbsp;=&nbsp;s.mapToInt(i&nbsp;->&nbsp;1).reduce((a,&nbsp;b)&nbsp;->&nbsp;a&nbsp;+&nbsp;b).orElse(0);或者正如@Holger 在下面评论的那样在映射后使用 sum() 。Integer&nbsp;count&nbsp;=&nbsp;s.mapToInt(i&nbsp;->&nbsp;1).sum();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java