我正在尝试将基于java的代码行转换为scla,但不会将相同的功能转换为
def isParameterSet(parameter: String): Boolean = {
//java based
val iterator=newConfig.entrySet().iterator()
while (iterator.hasNext())
{
if (iterator.next().getKey()==parameter)
return true
}
return false
}
将此转换为更多scala友好版本:
def isParameterSet(parameter: String): Boolean = {
import scala.collection.JavaConversions._
val iterator=newConfig.entrySet().foreach(u=>if (u.getKey()=="parameter") return true)
return false
}
上面的代码总是返回false
答案 0 :(得分:2)
使用exists函数,有一个简单的示例,我想你会得到这个想法
scala> var l = List(1,2,3,4,5)
l: List[Int] = List(1, 2, 3, 4, 5)
scala> l.exists( x=>x==5)
res4: Boolean = true
答案 1 :(得分:0)
forEach是一个sideEffecting函数,将迭代整个Map。传递给forEach的闭包不能被认为是一个必要的while循环。 Scala和函数式编程是声明性的。所以你要做的就是声明一些函数在地图的每个元组上运行。
u=>if (u.getKey()=="parameter") return true
这是一个声明的函数,它将在Map的每个元素上执行(映射可以像列表一样遍历)。 lambda也在与isParameterSet不同的上下文中运行。我认为scala代码的等效代码段是:
def checkParameter(parameter: String, iterator: Iterator): Unit = {
if (iterator.next().getKey() == parameter)
return true
}
def isParameterSet(parameter: String): Boolean = {
//java based
val iterator = newConfig.entrySet().iterator()
while (iterator.hasNext()) {
checkParameter(parameter, iterator)
}
return false
}
因此,返回true不会影响isParameterSet,因为它位于不同的上下文中。
了解闭包和Lambda表达式的工作原理。这个想法不是特定于Scala的,所以你可以在你更熟悉的东西中学习这些概念(Java 8现在有闭包)。在陌生的语言之上学习这些东西可能令人沮丧。
下面是一些代码,用于处理如何检查参数是否已设置。我在这里做了一些假设,其中空值表示未设置参数。我也试着用你评论我的意图。如果不清楚,请告诉我
package parameter_set
// Its usually considered ideal to keep all imports at the top of the code just like in Java
import java.util
import scala.collection.JavaConverters._
object ParameterSet extends App {
val javaConfig: util.Map[String, String] = new util.HashMap[String, String]()
javaConfig.put("param1", "value1")
javaConfig.put("param2", "value2")
javaConfig.put("param3", "value3")
javaConfig.put("param4", null)
// The Option will make sense in a second
val newConfig: Map[String, String] = javaConfig
// converts it to a mutable map
.asScala
// converts it to an immutable map
.toMap
// I am a bit paranoid since this was a Java map and I need to make sure all null values are handled as Option
.mapValues(value => Option(value))
// This resolves a known issue since mapValues creates a view over the underlying Map (http://stackoverflow.com/questions/14882642/scala-why-mapvalues-produces-a-view-and-is-there-any-stable-alternatives)
.view
.force
// Now we need to only take the key -> values
.collect {
case (key, Some(value)) => key -> value
}
def isParameterSet(parameter: String): Boolean = newConfig.exists(parameters => parameters._1 == parameter)
println(isParameterSet("param2")) //true
println(isParameterSet("param7")) //false
println(isParameterSet("param4")) //false
}
答案 2 :(得分:0)
打开Config对象(root)以获取Java映射,然后将其转换为Scala映射,然后测试参数键:
def isParameterSet(parameter: String): Boolean = {
import scala.collection.JavaConversions._
mapAsScalaMap(newConfig.root().unwrapped()).contains(parameter)
}