【问题标题】:Bad operand types for binary operator '%' [duplicate]二元运算符“%”的错误操作数类型[重复]
【发布时间】:2023-04-06 08:58:01
【问题描述】:

我正在尝试编写 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

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

【问题讨论】:

  • 你不需要类似i -> i % 2 == 0的东西吗?
  • i % 2 不计算为布尔值,您想要i % 2 == 0 还是i % 2 == 1

标签: java list java-8


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你有几个错误:

    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(...)
    • 这是正确的,并且还添加了一些关于原因的上下文:)
    【解决方案3】:

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

    【讨论】:

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