Ответ 1
В вашем случае (строка = reader.readNext()) является функциональным литералом, который возвращает тип Unit. Вы можете переписать код следующим образом:
while( {line = reader.readNext(); line!= null} ) { .... }
Я использую 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?
В вашем случае (строка = reader.readNext()) является функциональным литералом, который возвращает тип Unit. Вы можете переписать код следующим образом:
while( {line = reader.readNext(); line!= null} ) { .... }
Условное выражение присваивания имеет тип Unit
в Scala. В этом причина предупреждения вашего компилятора.
В Scala есть хорошая идиома, которая позволяет избежать цикла while:
val iterator = Iterator.continually(reader.readNext()).takeWhile(_ != null)
Это дает вам итератор над тем, что возвращает reader.readNext
.
Метод continually
возвращает "бесконечный" итератор, а takeWhile
принимает префикс этого, вплоть до первого нулевого значения.
(Scala 2.8)
Вы можете использовать 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
Вы пишете код 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)
}
Назначение в Scala не возвращает значение, Unit похоже на void на C или С++.
попробовать
var line = ""
while ({line = reader.readNext(); line != null}) { ... }
Это работает, потому что возвращается значение последнего выражения в блоке, и в этом случае оно является булевым, которое требуется , а