流API map()和filter()

gho*_*der 3 java lambda java-8 java-stream

我正在尝试学习Stream API,我遇到了以下代码:

public class Test{
    public static void main (String[] args)
    {    
        List <Integer> a = Arrays.asList(2,3,4);
        System.out.println(a.stream().filter(i -> i < 10).average());
    }
}
Run Code Online (Sandbox Code Playgroud)

它给了一个

符号"average()"未找到错误.

但是,当我用下面的更改sysout时,它按预期运行正常

System.out.println(a.stream().filter(i -> i < 10).mapToInt(i -> i).average());
Run Code Online (Sandbox Code Playgroud)

有人可以解释这里的区别吗?

Era*_*ran 9

A Stream<T>没有average()方法,因为元素类型T可以是任何引用类型,它不一定具有计算Stream元素平均值的含义.

另一方面,a IntStream具有一种average()方法,因为它具有int很好地定义了平均操作的元素.

因此,您必须将a转换Stream<Integer>IntStream(via mapToInt())才能调用average().

  • @ghostrider`Arrays.stream(new int [] {2,3,4})`返回一个`IntStream`,它有一个`average`方法.另一方面,`Arrays.stream(new Integer [] {2,3,4})`将返回一个没有`average`方法的`Stream <Integer>`. (3认同)
  • @ghostrider`Arrays.stream()`需要一个数组,而不是List,所以`Arrays.stream(Arrays.asList())`不会通过编译. (2认同)