2015-02-22 16 views
5

Dato il seguente codice:Tipi incompatibili: tipo di ritorno errato nell'espressione lambda?

/** 
* 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(); 
    }); 
} 

mio compilatore mi dà il seguente errore:

error: incompatible types: bad return type in lambda expression 

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

missing return value 

Sono in esecuzione Gradle versione 2.2, e ho JDK 8u31 installato. La cosa interessante che Eclipse non mostra alcun errore del compilatore, anche dopo aver pulito e ricostruito il mio progetto, ma quando eseguo gradle build sulla riga di comando, ottengo questo errore del compilatore.

Perché sto ricevendo questo errore e come lo risolvo?

risposta

12

Non è possibile avere void come tipo per la seconda e terza espressione in un'espressione ternaria. Vale a dire, non si può fare

.... ? System.out.print(...) : System.out.print(...) 
        ^^^^^     ^^^^^ 

(Se Eclipse dice il contrario, si tratta di un bug.) Utilizzare un if dichiarazione invece:

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

O scomposizione come segue:

minesweeperGrid.forEach((k, v) -> { 
    v.stream().forEach(
     square -> { 
      System.out.println(square.isMineLocatedHere() 
        ? "*" : square.getNumSurroundingMines()) 
     }) 
    }); 
+0

Grazie per la spiegazione, aioobe. La tua soluzione ha funzionato. :) –

+2

... o 'minesweeperGrid.values ​​(). Stream(). FlatMap (Collection :: stream) .forEach (quadrato -> ...)' poiché non sembra che la chiave sia necessaria nel corpo . (impossibile modificare il mio commento precedente :-(). –

+0

In alternativa, è possibile sostituire 'print' con' append'. Poiché quest'ultimo restituisce un valore, può essere utilizzato con l'operatore ternario. (Ma l'istruzione 'if' è più chiaro qui però) Si noti che nella seconda soluzione che sposta l'espressione ternaria all'interno dell'invocazione di stampa, le parentesi graffe non sono necessarie. – Holger

Problemi correlati