在scala中编写具有返回值的等效java函数
我正在尝试将一行基于java的代码转换为scla,但没有实现相同的功能在scala中编写具有返回值的等效java函数,scala,Scala,我正在尝试将一行基于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 fals
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
}
上面的代码总是使用exists函数返回false,这里有一个简单的示例,我想你会明白的
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
使用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
forEach是一个副作用函数,将在整个映射上迭代。传递到forEach的闭包不能被视为相同的命令while循环。Scala和函数式编程是声明性的。因此,您所做的只是声明一些要在映射的每个元组上运行的函数
u=>if (u.getKey()=="parameter") return true
这是一个声明的函数,将在映射的每个元素上执行(映射可以像列表一样遍历)。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特有的,因此您可以学习一些您更熟悉的概念(Java8现在有闭包)。在不熟悉的语言上学习这些东西可能会令人沮丧
下面是一些处理如何检查参数是否已设置的代码。我在这里做了一些假设,其中空值表示未设置参数。我也试着为你评论我的意图。如果不清楚,请告诉我
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
}
forEach是一个副作用函数,将在整个映射上迭代。传递到forEach的闭包不能被视为相同的命令while循环。Scala和函数式编程是声明性的。因此,您所做的只是声明一些要在映射的每个元组上运行的函数
u=>if (u.getKey()=="parameter") return true
这是一个声明的函数,将在映射的每个元素上执行(映射可以像列表一样遍历)。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特有的,因此您可以学习一些您更熟悉的概念(Java8现在有闭包)。在不熟悉的语言上学习这些东西可能会令人沮丧
下面是一些处理如何检查参数是否已设置的代码。我在这里做了一些假设,其中空值表示未设置参数。我也试着为你评论我的意图。如果不清楚,请告诉我
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
}
展开配置对象(根)以获取Java映射,然后将其转换为Scala映射,然后测试参数键:
def isParameterSet(parameter: String): Boolean = {
import scala.collection.JavaConversions._
mapAsScalaMap(newConfig.root().unwrapped()).contains(parameter)
}
展开配置对象(根)以获取Java映射,然后将其转换为Scala映射,然后测试参数键:
def isParameterSet(parameter: String): Boolean = {
import scala.collection.JavaConversions._
mapAsScalaMap(newConfig.root().unwrapped()).contains(parameter)
}
您是否关心该值是否为null?一般来说,Scala不希望在其系统中使用null,但由于newConfig是一个Java映射,因此有可能会有一个null值。您是否关心该值是否为null?一般来说,Scala不希望在其系统中使用null,但由于newConfig是一个Java映射,因此有可能会有一个null值。我希望它是val而不是var。使用var的任何具体原因??没有具体原因,我认为这与此问题无关。这不相关,但很重要。空格也到处都是:
List(1,2,3,4,5)
和l.exists(x=>x==5)
更容易阅读,我更希望它是val而不是var。使用var的任何具体原因??没有具体原因,我认为这与这个问题无关。这不相关,但很重要。空格也到处都是:List(1,2,3,4,5)
和l.exists(x=>x==5)
更容易阅读