将一系列Scala映射操作推送到单独的列表中

将一系列Scala映射操作推送到单独的列表中,scala,map,placeholder,Scala,Map,Placeholder,正在修补将Java模块翻译成Scala的问题,并认为这将是一个很好的地图/占位符学习练习。。。有没有办法将这个代码块的本质转换成单个(map?)语句?(这是我到目前为止为一个可伸缩的版本所提出的) 简言之: 迭代数据处理器列表 从每个DP中提取一个字符串(称为“Alpha”) Alphpa用作(外部定义的)HashMap的查找键,该HashMap获取/返回一个SQL prep'd值(称之为“Zed”) Alpha和Zed然后配对并附加到它们自己的列表/散列/集合/任何内容(称为“sqlColum

正在修补将Java模块翻译成Scala的问题,并认为这将是一个很好的地图/占位符学习练习。。。有没有办法将这个代码块的本质转换成单个(map?)语句?(这是我到目前为止为一个可伸缩的版本所提出的)

简言之:

  • 迭代数据处理器列表
  • 从每个DP中提取一个字符串(称为“Alpha”)
  • Alphpa用作(外部定义的)HashMap的查找键,该HashMap获取/返回一个SQL prep'd值(称之为“Zed”)
  • Alpha和Zed然后配对并附加到它们自己的列表/散列/集合/任何内容(称为“sqlColumnValuePair”)
  • 为了便于阅读,这些行已经扩展;可以使用各种映射(例如1和2)提取部分,但是有没有一种方法可以使用单个映射来实现这一点?我觉得我应该能够把它浓缩到这一步……但是我没有足够的缩放地图/占位符的经验来知道这是否是徒劳的努力

    蒂亚

    (注意:我发现这篇文章的答案是关于Scala地图操作的一个很有教育意义的总结:)

    编辑:我从原始示例中删除了一个.getOrElse()操作,因为我认为这只是对核心问题的分散注意力


    编辑2:经过一些考虑,在这里表达我的学习目标的一个更好的方式可能是:“如何使用最少数量的操作来复制此功能。”(我假设这将是映射操作、部分函数等的某种组合。)这样做,希望能更广泛地理解可在类似情况下使用的Scala类/运算符集。

    我不太清楚“将其压缩为一条语句”是什么意思。 您可以定义一个函数,在给定处理器的情况下,该函数返回一对(fieldName,sqlValue),并在映射中使用该函数

    def getColumnValuePair(p:Processor) = { 
      val fieldName = p.getWriteColumn
      fieldName -> p.getSqlValue(hashMapOfFieldValuePairs.get(fieldName))
    }
    
    val sqlColumnValuePair = dataProcList.map(getColumnValuePair)
    

    我不太清楚你说的“把它浓缩成一句话”是什么意思。 您可以定义一个函数,在给定处理器的情况下,该函数返回一对(fieldName,sqlValue),并在映射中使用该函数

    def getColumnValuePair(p:Processor) = { 
      val fieldName = p.getWriteColumn
      fieldName -> p.getSqlValue(hashMapOfFieldValuePairs.get(fieldName))
    }
    
    val sqlColumnValuePair = dataProcList.map(getColumnValuePair)
    

    你可以用一个简单的方法来理解(这可能是最惯用的方法):

    用于{
    
    处理器您可以使用一个用于理解的处理器(这可能是最惯用的方法):

    用于{
    
    处理器这是我经过测试的解决方案。它不会处理任何故障(与原始解决方案相同)

    对象列表扩展应用程序{
    导入ListStuffMock_
    //原始解决方案(稍微修改以实际编译和运行)
    var sqlColumnValuePair=List[(字符串,字符串)]()
    dataProcList foreach(处理器=>{
    val fieldName:String=processor.getWriteColumn
    val sqlValue:String=processor.getSqlValue(hashMapOfFieldValuePairs.get(fieldName.get)
    sqlColumnValuePair:+=((字段名,sqlValue))
    })
    val originalSolution=sqlColumnValuePair
    //IMO最具可读性的解决方案
    val newSolution=for{
    处理机{
    val fieldName=p.getWriteColumn
    val sqlValue=p.getSqlValue(hashMapOfFieldValuePairs.get(fieldName.get)
    (字段名,sqlValue)
    }
    )
    println(s“原始解决方案:$originalSolution”)
    println(s“新解决方案:$newSolution”)
    println(s“新解决方案2:$newSolution2”)
    }
    对象ListStuffMocks{
    对象数据处理器{
    val db=Map(
    “valWriteCol1”->“sqlValWriteCol1”,
    “valwritecl2”->“sqlvalwritecl2”,
    “valWriteCol3”->“sqlValWriteCol3”
    )
    }
    类数据处理器(writeColumn:String){
    def getWriteColumn=writeColumn
    def getSqlValue(字段:String):String=DataProcessor.db.get(字段).get
    }
    val hashMapOfFieldValuePairs=映射(
    “writeCol1”->“valWriteCol1”,
    “writecl2”->“valwritecl2”,
    “writeCol3”->“valWriteCol3”
    )
    val dataProcList=列表(
    新数据处理器(“writeCol1”),
    新数据处理器(“writeCol3”)
    )
    }
    
    输出:

    Original solution: List((writeCol1,sqlValWriteCol1), (writeCol3,sqlValWriteCol3)) New solution: List((writeCol1,sqlValWriteCol1), (writeCol3,sqlValWriteCol3)) New solution #2: List((writeCol1,sqlValWriteCol1), (writeCol3,sqlValWriteCol3)) 原始解决方案:列表((writeCol1,sqlValWriteCol1),(writeCol3,sqlValWriteCol3)) 新解决方案:列表((writeCol1,sqlValWriteCol1),(writeCol3,sqlValWriteCol3)) 新解决方案#2:List((writeCol1,sqlValWriteCol1),(writeCol3,sqlValWriteCol3)) 编辑1:

    我不知道您为什么不想使用来理解-最终它被编译到映射调用中…但正如您所愿,我只添加了一个映射调用的解决方案(
    newSolution2
    )。

    这是我的测试解决方案。它不会处理任何失败(与原始解决方案相同)

    对象列表扩展应用程序{
    导入ListStuffMock_
    //原始解决方案(稍微修改以实际编译和运行)
    var sqlColumnValuePair=List[(字符串,字符串)]()
    dataProcList foreach(处理器=>{
    val fieldName:String=processor.getWriteColumn
    val sqlValue:String=processor.getSqlValue(hashMapOfFieldValuePairs.get(fieldName.get)
    sqlColumnValuePair:+=((字段名,sqlValue))
    })
    val originalSolution=sqlColumnValuePair
    //IMO最具可读性的解决方案
    val newSolution=for{
    处理机{
    val fieldName=p.getWriteColumn
    val sqlValue=p.getSqlValue(hashMapOfFieldValuePairs.get(fieldName.get)
    (字段名,sqlValue)
    }
    )
    println(s“原始解决方案:$originalSolution”)
    println(s“新解决方案:$newSolution”)
    println(s“新解决方案2:$newSolution2”)
    }
    对象ListStuffMocks{
    对象数据处理器{
    val db=Map(
    “valWriteCol1”->“sqlValWriteCol1”,
    “valwritecl2”->“sqlvalwritecl2”,
    “valWriteCol3”->“sqlValWriteCol3”
    )
    }
    类数据处理器(writeColumn:String){
    def getWriteColumn=writeColumn
    def getSqlValue(字段:String):String=DataProcessor.db.get(字段).get
    }
    val hashMapOfFieldValuePairs=映射(
    “writeCol1”->“valWriteCol1”,
    “writecl2”->“valwritecl2”,
    “writeCol3”->“valWriteCol3”
    )
    val dataProcList=列表(
    新数据处理
    
    object ListStuff extends App {
    
      import ListStuffMocks._
    
      // original solution (slightly modified to actually compile and run)
      var sqlColumnValuePair = List[(String, String)]()
      dataProcList foreach (processor => {
        val fieldName: String = processor.getWriteColumn
        val sqlValue: String = processor.getSqlValue(hashMapOfFieldValuePairs.get(fieldName).get)
        sqlColumnValuePair :+= ((fieldName, sqlValue))
      })
      val originalSolution = sqlColumnValuePair
    
      // IMO most readable solution
      val newSolution = for {
        processor <- dataProcList
        fieldName = processor.getWriteColumn
        sqlValue = processor.getSqlValue(hashMapOfFieldValuePairs.get(fieldName).get)
      } yield (fieldName, sqlValue)
    
      // requested map-solution
      val newSolution2 = dataProcList.map(
        (p) => {
          val fieldName = p.getWriteColumn
          val sqlValue = p.getSqlValue(hashMapOfFieldValuePairs.get(fieldName).get)
          (fieldName, sqlValue)
        }
      )
    
      println(s"Original solution: $originalSolution")
      println(s"New solution:      $newSolution")
      println(s"New solution #2:   $newSolution2")
    }
    
    object ListStuffMocks {
    
      object DataProcessor {
        val db = Map(
          "valWriteCol1" -> "sqlValWriteCol1",
          "valWriteCol2" -> "sqlValWriteCol2",
          "valWriteCol3" -> "sqlValWriteCol3"
        )
      }
    
      class DataProcessor(writeColumn: String) {
        def getWriteColumn = writeColumn
    
        def getSqlValue(field: String): String = DataProcessor.db.get(field).get
      }
    
      val hashMapOfFieldValuePairs = Map(
        "writeCol1" -> "valWriteCol1",
        "writeCol2" -> "valWriteCol2",
        "writeCol3" -> "valWriteCol3"
      )
      val dataProcList = List(
        new DataProcessor("writeCol1"),
        new DataProcessor("writeCol3")
      )
    }
    
    Original solution: List((writeCol1,sqlValWriteCol1), (writeCol3,sqlValWriteCol3)) New solution: List((writeCol1,sqlValWriteCol1), (writeCol3,sqlValWriteCol3)) New solution #2: List((writeCol1,sqlValWriteCol1), (writeCol3,sqlValWriteCol3))
    dataProcList.map( x => 
      ( x.getWriteColumn -> x.getSqlValue(hashMapOfFieldValuePairs.get(x.getWriteColumn)) ) 
    )
    
    dataProcList.map(x=>(x,x.getWriteColumn)).map(y=>(y._2->y._1.getSqlValue(hashMapOfFieldValuePairs.get(y._2))))