Подтвердить что ты не робот

Scala Тип устройства

Я использую opencsv для разбора csv файлов, а мой код

while( (line = reader.readNext()) != null ) { .... }

Я получил сообщение о компиляторе:

 comparing values of types Unit and Null using `!=' will always yield true
 [warn]     while( (aLine = reader.readNext()) != null ) {

Как мне сделать цикл while?

4b9b3361

Ответ 1

В вашем случае (строка = reader.readNext()) является функциональным литералом, который возвращает тип Unit. Вы можете переписать код следующим образом:

while( {line = reader.readNext();  line!= null} ) { .... }

Ответ 2

Условное выражение присваивания имеет тип Unit в Scala. В этом причина предупреждения вашего компилятора.

В Scala есть хорошая идиома, которая позволяет избежать цикла while:

val iterator = Iterator.continually(reader.readNext()).takeWhile(_ != null)

Это дает вам итератор над тем, что возвращает reader.readNext.

Метод continually возвращает "бесконечный" итератор, а takeWhile принимает префикс этого, вплоть до первого нулевого значения.

(Scala 2.8)

Ответ 3

Вы можете использовать Stream, чтобы получить то, что хотите:

Stream.continually(reader.readLine()).takeWhile( _ ne null) foreach { line =>
  //do Stuff
}

У этого есть дополнительное преимущество других классных вещей:

Stream.continually(reader.readLine()).takeWhile( _ ne null) match {
  case head #:: tail => //perhaps you need to do stuff with the first element?
  case _             => //empty
}

EDIT - благодаря mkneissl для указания, я должен был включить это предупреждение:

scala> Stream.continually(1).take(100000000).foreach(x=>()) 

scala> val s = Stream.continually(1).take(100000000) 
s: scala.collection.immutable.Stream[Int] = Stream(1, ?) 

scala> s.foreach(x=>()) java.lang.OutOfMemoryError: Java heap space

Ответ 4

Вы пишете код Scala так, как вы его пишете на Java. Попробуйте сделать это более чем в стиле Scala. Чтобы прочитать текстовый файл по строкам и сделать что-то с каждой строкой, попробуйте следующее:

import java.io.File
import scala.io.Source

Source.fromFile(new File("myfile.txt")).getLines.foreach { line =>
    // Do something with the line, for example print it
    println(line)
}

Ответ 5

Назначение в Scala не возвращает значение, Unit похоже на void на C или С++.

попробовать

var line = ""

while ({line = reader.readNext(); line != null}) { ... }

Это работает, потому что возвращается значение последнего выражения в блоке, и в этом случае оно является булевым, которое требуется , а