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();
这种方法的界面有点复杂:

  • U identity
    设置为0-开始计数
  • 累加器
    (a,b)->a+1
    )将字符串转换为
    int
    ,每个字符串将转换为1并添加到以前的结果(0+1+1+1…)
  • 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();
      
      这种方法的界面有点复杂:

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

      显示您的代码dude。
      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