У меня есть функция scala val следующим образом:
val getTimestampEpochMillis = (year:Int, month:Int, day:Int, hour:Int, quarterHour:Int, minute:Int, seconds:Int) => {
var tMinutes = minute
var tSeconds = seconds
if (minute == 0){
if (quarterHour == 1){
tMinutes = 22
tSeconds = 30
}else if (quarterHour == 2){
tMinutes = 37
tSeconds = 30
}else if (quarterHour == 3){
tMinutes = 52
tSeconds = 30
}else if (quarterHour == 0){
tMinutes = 7
tSeconds = 30
}
}
val localDateTime = LocalDateTime.of(year, month, day, hour, tMinutes, tSeconds)
localDateTime.atZone(ZoneId.of("GMT")).toInstant().toEpochMilli()
}
Когда я вызываю эту функцию из Java, Я получаю следующую ошибку:
[ERROR] required: no arguments
[ERROR] found: int,int,int,int,int,int,int
[ERROR] reason: actual and formal argument lists differ in length
Код Java, вызывающий scala val-функцию:
Long minTimestampOfGranularity = getTimestampEpochMillis(year, 1, 1, 0, 0, 0, 0);
Спасибо .. не могли бы вы изложить это как ответ, объяснив, как, почему и т. д.
Java не использует синтаксис функции сахара, отображая (..) в apply
Потому что функции в Scala являются экземплярами класса Function1, Function2... и т. д. И у этих классов есть метод apply, который вызывается всякий раз, когда вы вызываете эти функции в Scala. Но вы должны явно вызывать этот метод apply с Java.




Пытаться
getTimestampEpochMillis().apply(year, 1, 1, 0, 0, 0, 0);
и обратите внимание на скобки () в getTimestampEpochMillis(). Изучив сгенерированный класс с помощью javap, мы получим
public scala.Function7<java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, scala.runtime.BoxedUnit> getTimestampEpochMillis();
где мы видим, что getTimestampEpochMillis() возвращает scala.Function7, поэтому мы сначала должны вызвать getTimestampEpochMillis(), прежде чем мы сможем apply аргументы.
getTimestampEpochMillis.apply(..)