不兼容的类型:lambda表达式中的错误返回类型?

BJ *_*ruz 5 java eclipse lambda java-8

给出以下代码:

/**
 * Prints the grid with hint numbers.
 */
private void printGridHints() {
  minesweeperGrid.forEach((k, v) -> {
    v.stream().forEach(
        square -> square.isMineLocatedHere() ? System.out.print("*") : System.out.print(square
            .getNumSurroundingMines()));
    System.out.println();
  });
}
Run Code Online (Sandbox Code Playgroud)

我的编译器给了我以下错误:

error: incompatible types: bad return type in lambda expression

square -> square.isMineLocatedHere() ? System.out.print("*") : System.out.print(square
                                                                                ^

missing return value
Run Code Online (Sandbox Code Playgroud)

我正在运行Gradle 2.2版,我安装了JDK 8u31.有趣的是Eclipse没有显示任何编译器错误,即使在我清理和重建我的项目之后,但是当我gradle build在命令行上运行时,我得到了这个编译器错误.

为什么我会收到此错误,我该如何解决?

aio*_*obe 12

您不能void在三元表达式中使用第二个和第三个表达式作为类型.即,你做不到

.... ? System.out.print(...) : System.out.print(...)
                  ^^^^^                   ^^^^^
Run Code Online (Sandbox Code Playgroud)

(如果Eclipse另有说法,那就是一个bug.)使用if语句代替:

minesweeperGrid.forEach((k, v) -> {
    v.stream().forEach(
        square -> {
            if (square.isMineLocatedHere())
                System.out.println("*");
            else
                System.out.println(square.getNumSurroundingMines());
        })
  });
Run Code Online (Sandbox Code Playgroud)

或者按如下方式细分:

minesweeperGrid.forEach((k, v) -> {
    v.stream().forEach(
        square -> {
            System.out.println(square.isMineLocatedHere()
                    ? "*" : square.getNumSurroundingMines())
        })
  });
Run Code Online (Sandbox Code Playgroud)

  • ...或者`minesweeperGrid.values().stream().flatMap(Collection :: stream).forEach(square - > ...)`因为它看起来不需要正文中的密钥.(无法编辑我以前的评论:-(). (2认同)