Вызов Scala «val function» из Java дает ошибку

У меня есть функция 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);
getTimestampEpochMillis.apply(..)
cchantep 14.07.2019 10:45

Спасибо .. не могли бы вы изложить это как ответ, объяснив, как, почему и т. д.

Remis Haroon - رامز 14.07.2019 10:50

Java не использует синтаксис функции сахара, отображая (..) в apply

cchantep 14.07.2019 11:13

Потому что функции в Scala являются экземплярами класса Function1, Function2... и т. д. И у этих классов есть метод apply, который вызывается всякий раз, когда вы вызываете эти функции в Scala. Но вы должны явно вызывать этот метод apply с Java.

sarveshseri 14.07.2019 11:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пытаться

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 аргументы.

Другие вопросы по теме