Как использовать val вместо var в scala - PullRequest
0 голосов
/ 17 февраля 2020

Я просто хочу удалить 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
   })
}

Ответы [ 2 ]

4 голосов
/ 17 февраля 2020

if - это выражение в Scala - оно возвращает результирующее значение. Это означает, что вы можете сохранить свою логику c и просто присвоить возвращаемое значение оператора 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
0 голосов
/ 17 февраля 2020

Вот оно:

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
...