在scala中编写具有返回值的等效java函数

在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

我正在尝试将一行基于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
}

上面的代码总是使用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)
更容易阅读