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