【问题标题】:Java stream question, mapToInt and average methodJava流问题、mapToInt和average方法
【发布时间】:2020-04-05 17:15:27
【问题描述】:

为什么我可以在一个上调用average() 方法,而在另一个上不行?它们不应该是等价的吗?

示例 1 - 有效

List<String> stringList = new ArrayList<>();
    stringList.add("2");
    stringList.add("4");
    stringList.add("6");
// String array ("2","4", "6"
averageValue = stringList.stream()
                .mapToInt(s -> Integer.valueOf(s))
                .average()
                .getAsDouble();   

示例 2 - 未编译(已删除 mapToInt 调用,因为已传递整数流)

List<Integer> IntegerList = new ArrayList<>();
        IntegerList.add(2);
        IntegerList.add(4);
        IntegerList.add(6);

averageValue = IntegerList.stream()
                    .average()
                    .getAsDouble();  

问题,当我已经将整数流传递给 mapToInt 方法时,为什么还需要调用它?

【问题讨论】:

  • 尼特:使用Integer.parseInt 而不是valueOf

标签: java java-stream average


【解决方案1】:

有两种不同的类型:Stream&lt;Integer&gt;IntStream

Java 的泛型不能有只适用于一些 泛型的方法。例如,它不能有Stream&lt;Integer&gt;.average(),也不能Stream&lt;PersonName&gt;.average(),即使普通人名没有意义。

因此,Stream 有一个mapToInt 方法将其转换为IntStream,然后提供average() 方法。

【讨论】:

  • 我明白了,如果我不理解你,请纠正我,所以理论上 IntegerList.stream().average() 工作是合乎逻辑的,但由于它不适用于所有可能的输入,因此打破模板的工作方式,我仍然必须将 MapToInt 方法应用于 ItegerStream 才能访问平均方法?
  • 谢谢,它确实为我澄清了困惑。
【解决方案2】:

IntStream 提供了average() 方法,所以要使用它需要使用mapToInt 方法将Stream&lt;Integer&gt; 转换为IntStream

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多