Java 对流中的元素进行计数并返回整数而不是long
我需要对流中的元素进行计数,并在不强制转换的情况下将其分配给整数Java 对流中的元素进行计数并返回整数而不是long,java,java-8,java-stream,Java,Java 8,Java Stream,我需要对流中的元素进行计数,并在不强制转换的情况下将其分配给整数 .count()确实返回long 想了想.collect(Collectors.reduce(..),但想不出来。 我觉得有些简单的东西我不懂 我的尝试: Stream<String> s = Stream.of("Hallo ", "Test", "String"); Integer count = s.filter(e -> (e.length() >= lb && e.length()
.count()
确实返回long
想了想.collect(Collectors.reduce(..)
,但想不出来。
我觉得有些简单的东西我不懂
我的尝试:
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);
streams=Stream.of(“Hallo”、“Test”、“String”);
整数计数=s.filter(e->(e.length()>=lb&&e.length()e.toUpperCase())
.distinct()
.collect(收集器.减少(0,e->1,整数::和));
系统输出打印项次(计数);
简单地说:不要
不要铸造,但也不要使事情过于复杂
而是寻找安全的方法,从count()
返回的long中获取int。首先请参见:
int bar = Math.toIntExact(someLong);
比如说。当您100%确定计算出的值始终符合int时,您只需避免为可能引发的算术异常放下捕获。你仍然有一种美好的感觉,你不能在没有注意的情况下“超限”
但如前所述:当您可以使用内置的功能来计算事物,并将它们转换为int/Integer时,不要将时间/精力投入到专门计算您自己的东西上。请记住:您输入到代码中的每个字符都需要稍后阅读和理解。因此,随着时间的推移,即使是“20个字符”也会增加。因此,当您总是倾向于较短的解决方案时,只要它们易于阅读/理解 简单地说:不要
不要铸造,但也不要使事情过于复杂
而是寻找安全的方法,从count()
返回的long中获取int。首先请参见:
int bar = Math.toIntExact(someLong);
比如说。当您100%确定计算出的值始终符合int时,您只需避免为可能引发的算术异常放下捕获。你仍然有一种美好的感觉,你不能在没有注意的情况下“超限”
但如前所述:当您可以使用内置的功能来计算事物,并将它们转换为int/Integer时,不要将时间/精力投入到专门计算您自己的东西上。请记住:您输入到代码中的每个字符都需要稍后阅读和理解。因此,随着时间的推移,即使是“20个字符”也会增加。因此,当您总是倾向于较短的解决方案时,只要它们易于阅读/理解 如果您想在不使用build-in.count()方法的情况下对流中的元素进行计数,那么可以将每个元素映射到一个int,并通过求和来减少。大概是这样的:
Integer count = s.mapToInt(i -> 1).reduce((a, b) -> a + b).orElse(0);
或者像@Holger在下面评论的那样,在映射后使用sum()
Integer count = s.mapToInt(i -> 1).sum();
如果您想在不使用build-in.count()方法的情况下对流中的元素进行计数,那么可以将每个元素映射到一个int,并通过求和来减少。大概是这样的:
Integer count = s.mapToInt(i -> 1).reduce((a, b) -> a + b).orElse(0);
或者像@Holger在下面评论的那样,在映射后使用sum()
Integer count = s.mapToInt(i -> 1).sum();
使用Java8,您可以使用Math.toIntExact(longval) 返回长参数的值;如果 值溢出整数
使用Java8,您可以使用Math.toIntExact(longval) 返回长参数的值;如果 值溢出整数
这是正确的方法。将所有不同的值转换为
1
using-它生成了能够直接处理数值流而无需映射的方法:
Integer count = s.filter(e -> (e.length() >= lb && e.length() <= ub && !e.contains(" ")))
.map(String::toUpperCase)
.distinct()
.mapToInt(i -> 1)
.sum();
这种方法的界面有点复杂:
设置为0-开始计数U identity
(累加器
)将字符串转换为(a,b)->a+1
,每个字符串将转换为1并添加到以前的结果(0+1+1+1…)int
组合两个连续的值(combiner
)-这是(a,b)->a+b
值的总和,实际上就是计数1
- 这是正确的方法。将所有不同的值转换为
1
using-它生成了能够直接处理数值流而无需映射的方法:
Integer count = s.filter(e -> (e.length() >= lb && e.length() <= ub && !e.contains(" ")))
.map(String::toUpperCase)
.distinct()
.mapToInt(i -> 1)
.sum();
这种方法的界面有点复杂:
设置为0-开始计数U identity
(累加器
)将字符串转换为(a,b)->a+1
,每个字符串将转换为1并添加到以前的结果(0+1+1+1…)int
组合两个连续的值(combiner
)-这是(a,b)->a+b
值的总和,实际上就是计数1
count
返回longment long,抱歉。是的,这是一个语法错误。但毕竟我在这里看不到演员。我不知道OP在说什么,我也不知道他们为什么一直在下面贴“答案”@Holger@MạnhQuyế特恩盖伊ễn这是OP的解决方案尝试,事实上,似乎没有人注意到解决方案尝试已经足够了,除了一个悬挂的支架。更糟糕的是,有人刚刚在问题中编辑了一个解决方案,该编辑甚至得到了批准。显示您的代码dude。count
返回longment long,抱歉。是的,这是一个语法错误。但毕竟我在这里看不到演员。我不知道OP在说什么,我也不知道他们为什么一直在下面贴“答案”@Holger@MạnhQuyế特恩盖伊ễn这是OP的解决方案尝试,事实上,似乎没有人注意到解决方案尝试已经足够了,除了一个悬挂的支架。更糟糕的是,有人刚刚在问题中编辑了一个解决方案,这个编辑甚至得到了批准。好吧,如果你使用.mapToInt(i->1)
,你可以在上面调用sum()
。好吧,如果你使用.mapToInt(i->1)
,你可以在上面调用sum()
。嘿,谢谢。我会照你说的做。但这是一项考试任务。。所以我必须这么做。我想教授想让我们用一些coll