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

Dan*_*rgs 0 java java-stream

我需要计算Stream中的Elements并将其分配给Integer而不进行强制转换.

.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);
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 5

简单地说:不要.

不要演员,也不要让事情变得过于复杂.

而是寻找安全的方法来获得返回的长整数count().见这里对于初学者:

int bar = Math.toIntExact(someLong);
Run Code Online (Sandbox Code Playgroud)

例如.当您100%确定计算值总是适合int时,那么您只需避免放下可能抛出的ArithmeticException的catch.而你仍然有一种良好的感觉,你不能在没有注意的情况下"超越".

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

  • 好的,这是一个有效的要求,它改变了解决方案空间!然后就去接受那些完全适合你的答案.但请记住告诉你的导师GhostCat告诉你:"伙计,这不是你应该做的事情"! (5认同)

Nik*_*las 5

这是正确的方法。转换所有的不同的值,以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();
Run Code Online (Sandbox Code Playgroud)

无需映射到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);
Run Code Online (Sandbox Code Playgroud)

这个方法的接口有点复杂:

  • U identity 设置为 0 - 开始计数
  • accumulator( (a,b) -> a + 1) 将字符串转换为int,每个字符串将被转换为 1 并添加到前一个结果 (0+1+1+1...)。
  • combiner组合两个连续值 ( (a,b) -> a + b) -值的总和,1实际上是计数。