0

このコードはhttps://github.com/Netflix/astyanax/wiki/Cql-and-cql3から取得しました

私はscalaを初めて使用します。私の問題は、このforループをscalaループに変換することです。

助けていただけますか?

result = keyspace
        .prepareQuery(CQL3_CF)
        .withCql("SELECT * FROM employees WHERE empId='111';")
        .execute();

for (Row<Integer, String> row : result.getResult().getRows()) {
    LOG.info("CQL Key: " + row.getKey());

    ColumnList<String> 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));
} 

どうもありがとう

4

1 に答える 1

3

このコードを 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

于 2013-04-23T12:51:53.470 に答える