我需要计算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)
简单地说:不要.
不要演员,也不要让事情变得过于复杂.
而是寻找安全的方法来获得返回的长整数count().见这里对于初学者:
int bar = Math.toIntExact(someLong);
Run Code Online (Sandbox Code Playgroud)
例如.当您100%确定计算值总是适合int时,那么您只需避免放下可能抛出的ArithmeticException的catch.而你仍然有一种良好的感觉,你不能在没有注意的情况下"超越".
但正如所说:当你可以使用内置功能来计算事物时,不要投入时间/精力来专门计算你自己的东西,并把它们变成int/Integer.请记住:您在代码中输入的每个字符都需要在以后阅读和理解.因此,即使"20个字符"也会随着时间的推移而增加.所以当你总是倾向于更短的解决方案时,只要它们易于阅读/理解.
这是正确的方法。转换所有的不同的值,以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实际上是计数。| 归档时间: |
|
| 查看次数: |
875 次 |
| 最近记录: |