如何在scala中使用val而不是var



我只想删除var并在下面的代码中使用Val

def getConfigId: Long = {
val object1: java.util.List[objectA] = objectRepo.findByUser(User(session.id))
var object2: objectA = null
if (object1.size() == 1) {
object2 = object1.get(0)
} else if (object1.size() > 1) {
object2 = object1.get(0)
object1.forEach(a => if (a.endDate.compareTo(object2.endDate) >= 0) {
object2 = a
})
}
object2.configId
}

我正在尝试用例匹配,但它不起作用

def getConfigId: Long = {
val object1: java.util.List[objectA] = objectRepo.findByUser(User(session.id))
val object2: objectA = {
case x if object1.size() == 1 => object1.get(0)
case x => if (object1.size() > 1) {
object1.get(0)
object1.forEach(a => if(a.endDate.compareTo(object2.endDate) >= 0) {
object2 = a
})
}

if是Scala中的一个表达式,它返回一个结果值。这意味着,您可以保留您的逻辑,只需将if语句的返回值分配给变量:

var object2: objectA = if (object1.size() == 1) {
object1.get(0)
} else if (object1.size() > 1) {
object1
.filter(a => (a.endDate.compareTo(object1.get(0).endDate) >= 0))
.lastOption
.orElse(Some(object1.get(0)))
.get
}

或者更简单:

val object2 = object1
.filter(a => (a.endDate.compareTo(object1.get(0).endDate) >= 0))
.last

这里是:

import scala.jdk.javaapi.CollectionConverters
def getConfigId: Long = {
val values = objectRepo.findByUser(User(session.id))
val index = values.asScala.map(_.endDate).zipWithIndex.max._2
values.get(index).configId
}

或者:

import scala.jdk.javaapi.CollectionConverters
def getConfigId: Long = 
objectRepo.findByUser(User(session.id)).asScala.reverse.maxBy(_.endDate).configId

最新更新