在scala中使用返回值编写等效的java函数

时间:2016-08-11 01:48:06

标签: 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 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

3 个答案:

答案 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)
    }