二元运算符'%'的坏操作数类型

Til*_*ddy 8 java list java-8

我试图编写java 8方式:

public static void main (String[] args) throws java.lang.Exception
{
    int arr [] =  {3,4,5,6,7};

    Arrays.asList(arr)
          .stream()
          .filter(i -> i % 2)
          .sorted()
          .map(j -> j+ 1)
          .forEach(System.out::println);

}
Run Code Online (Sandbox Code Playgroud)

filter 应该扔掉奇数,但我得到以下错误.

Main.java:16: error: bad operand types for binary operator '%'
              .filter(i -> i % 2)
                             ^
  first type:  int[]
  second type: int
Main.java:18: error: bad operand types for binary operator '+'
              .map(j -> j+ 1)
                         ^
  first type:  int[]
  second type: int
Run Code Online (Sandbox Code Playgroud)

有人可以解释这个错误的原因吗?

Era*_*ran 14

你有几个错误:

  1. Arrays.asList()对于基本数组,返回一个List,其单个元素是该数组.因此,您的元素Stream是数组而不是整数.你应该int arr [] = {3,4,5,6,7}改为Integer arr [] = {3,4,5,6,7},以获得一个List<Integer>.
  2. filter采用谓词,即返回布尔值的方法.因此filter(i -> i % 2)应该filter(i -> i % 2 == 0)(如果你想保持偶数)或filter(i -> i % 2 == 1)(如果你想保持奇数).

  • 或者比使用`List <Integer>`创建一个原始流更好:`IntStream.of(arr).filter(...)` (5认同)

Lac*_*lev 14

您想要的代码可能如下所示:

public static void main (String[] args) throws java.lang.Exception {
    int arr [] =  {3,4,5,6,7};
    IntStream.of(arr)
          .filter(i -> i % 2 == 0)
          .sorted()
          .map(j -> j+ 1)
          .forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)
  1. IntStream提供了一系列原始的int-valued元素,这似乎是你需要的.这可能比装箱值更有效.
  2. filter这种情况下需要一个INT谓语.它应该返回truefalse如上面的示例代码中那样.您的lambda不是谓词,因为它返回一个整数.