このコードを scala ベースのループ構造に変換する 1 つの方法は次のとおりです。
import scala.collection.JavaConversions._
val result = keyspace
.prepareQuery(CQL3_CF)
.withCql("SELECT * FROM employees WHERE empId='111';")
.execute();
result.getResult().getRows() foreach { row =>
LOG.info("CQL Key: " + row.getKey())
val columns = row.getColumns()
LOG.info(" empid : " + columns.getIntegerValue("empid", null))
LOG.info(" deptid : " + columns.getIntegerValue("deptid", null))
LOG.info(" first_name : " + columns.getStringValue ("first_name", null))
LOG.info(" last_name : " + columns.getStringValue ("last_name", null))
}
JavaConversions._ にインポートすることで、Java Iterable (Rows オブジェクト) を に変換する暗黙的な変換にアクセスできるようになり、ループ構造scala.collection.Iterable
を使用できるようになります。foreach
さて、このコードは構文的には正しいですが、実際には適切な Scala コードではありません。ループ自体が何も返さないという点で、あまり機能的ではありません。また、代わりにオプションを使用する必要があるヌルを処理するいくつかの厄介なロジックもあります。map
結果データを単純なケース クラスにマップするために使用する、ソリューションのより機能的な例は、次のようになります。
import scala.collection.JavaConversions._
val result = keyspace
.prepareQuery(CQL3_CF)
.withCql("SELECT * FROM employees WHERE empId='111';")
.execute();
case class Employee(id:Option[Int], depId:Option[Int],
firstName:Option[String], lastName:Option[String])
def optFor[T](cl:ColumnList[String], func:(ColumnList[String] => T)):Option[T] = {
func(cl) match{
case null => None
case nonnull => Some(nonnull)
}
}
val employees = result.getResult().getRows() map { row =>
LOG.info("CQL Key: " + row.getKey())
val cl = row.getColumns()
val employee = Employee(optFor(cl, _.getIntegerValue("empid", null)),
optFor(cl, _.getIntegerValue("deptid", null)),
optFor(cl, _.getStringValue("first_name", null)),
optFor(cl, _.getStringValue("last_name", null)))
LOG.info(employee)
employee
}
Option
おそらく、null から変換へのより洗練された処理方法(おそらく暗黙的なものを介して) がありますが、これも同様に機能します。map
操作が完了すると、表示のために UI に戻ることができる一連 scala.collection.Iterable
のインスタンスが作成されます。Employee