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

时间:2016-12-29 09:46:49

标签: 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);

}

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

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

3 个答案:

答案 0 :(得分: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)(如果您想保留奇数)。

答案 1 :(得分:13)

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

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);
}
  1. IntStream提供了一系列原始的int-valued元素,这似乎是你需要的。这可能比装箱值更有效。
  2. 在这种情况下,filter需要int predicate。它应该返回truefalse,如上面的示例代码所示。您的lambda不是谓词,因为它返回一个整数。

答案 2 :(得分:3)

问题是Arrays.asList(arr)返回List数组。这就是你得到错误的原因。 Main.java:16: error: bad operand types for binary operator '%'