Как работает «за» в Scala? - PullRequest
0 голосов
/ 27 апреля 2018

Я совершенно новичок в программировании scala и пытаюсь понять функцию, написанную (функциональное программирование) нашим архитектором. Как я могу понять цикл for?

def checkS3BValidity(rows: Vector[Map[String, Object]]): Vector[Map[String, Object]] = {

val s3 = List("app_code", "s3_access_key", "s3_secret_key", "s3_primary_bkt_name")
val excludeList = new ListBuffer[String]

for (elem <- rows map (row => s3 map row)) {
  val elem_str = elem.map(_.toString)

  logger.info("verifying the S3 bucket passed from the ctrl table for each App")
  logger.info(s"Checking on App Code: ${elem head}")

  listS3Buckets(elem_str(1), elem_str(2)) match {

    case Some(allBktsInfo) =>
      logger.info(s"App: ${elem_str head} provided the bucket name as: ${elem_str(3)}")
      if (allBktsInfo.exists(x => x.getName == elem_str(3))) {
        logger.info(s"Provided S3 bucket: ${elem_str(3)} exists")
        println(s"s3 ${elem_str(3)} bucket exists")
      } else {
        logger.info(s"WARNING: Provided S3 bucket ${elem_str(3)} doesn't exists")
        logger.info(s"WARNING: Dropping the App: ${elem_str.head} from backup schedule")
        excludeList += elem_str.head // If the bucket is invalid then we exclude from backup
        println(s"s3 bucket ${elem_str(3)} doesn't exists")
    }

    case None =>
      logger.info(s"WARNING: Provided S3 bucket ${elem_str(3)} doesn't exists")
      logger.info(s"WARNING: Dropping the App: ${elem_str.head} from backup schedule")
      excludeList += elem_str.head // If the bucket is invalid then we exclude from backup
}

    logger.info(s"WARNING: Couldn't access these buckets: $excludeList")
rows filterNot (row => row.exists(m => excludeList.contains(m._2)))

  }

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Очень плохо написано. Использование Object почти никогда не рекомендуется. Использование изменяемого контейнера, такого как ListBuffer, не рекомендуется в функциональном коде. Полезная информация о названии каждой строки выбрасывается. Я бы написал что-то вроде:

def bucketExists(row: Map[String, String]): Boolean = {
  val buckets = listS3Buckets(row("s3_access_key"), row("s3_secret_key")) getOrElse List.empty[Bucket]
  val bucketNames = buckets map {_.getName}
  bucketNames contains row("s3_primary_bkt_name")
}

def getExistingBuckets(rows: Vector[Map[String, String]]): Vector[Map[String, String]] = {
  val (exists, missing) = rows partition bucketExists
  missing foreach {row =>
    logger.info(s"WARNING: Provided S3 bucket ${row("s3_primary_bkt_name")} doesn't exist")
    logger.info(s"WARNING: Dropping the App: ${row("app")} from backup schedule")
  }
  exists
}

Это значительно упрощает регистрацию информации о несуществующих сегментах и ​​возвращает список только тех сегментов, которые существуют.

0 голосов
/ 27 апреля 2018

В качестве резюме перебираем объекты S3, которые являются сегментами, и проверяем, существуют ли эти сегменты или нет. Дает вам логгер, чтобы проверить это и, наконец, записать все сегменты, которых нет в S3.

...