LINUX.ORG.RU

История изменений

Исправление Legioner, (текущая версия) :

Упоротость по js не проходит бесследно. Мне надо на яве сляпать приёмник команд из amqp. Команды имеют вид «<имя> <параметр 0> <...>». То есть я просто бедру строку из amqp, потом делаю split по пробелу, по первому элементу выбираю команду, остальное все скидываю в массив аргументов. Если он короче, чем может взять моя функция, то выплёвываем ошибку, если нет, вызываем функцию и выплёвываем то, что она вернёт.

Тебе нужен reflection.

Как он узнаёт, что лямбду надо прицепить к int operation??

Потому, что там один метод.

Что будет, если в интерфейсе больше двух методов?

Оно не скомпилируется.

Как туда запихать больше двух методов?

Использовать полноценные классы вместо лямбд.

Твой код

TwoArgInterface plusOperation = (a, b) -> a + b;
условно эквивалентен коду
TwoArgInterface plusOperation = new TwoArgInterface() {
  @Override
  public int operation(int a, int b) {
    return a + b;
  }
}
можешь считать это синтаксическим сахаром. Строго говоря это не совсем так, но в данном случае значения не имеет. Если тебе не хватает этого сахара, используй полный синтаксис.

Исходная версия Legioner, :

Упоротость по js не проходит бесследно. Мне надо на яве сляпать приёмник команд из amqp. Команды имеют вид «<имя> <параметр 0> <...>». То есть я просто бедру строку из amqp, потом делаю split по пробелу, по первому элементу выбираю команду, остальное все скидываю в массив аргументов. Если он короче, чем может взять моя функция, то выплёвываем ошибку, если нет, вызываем функцию и выплёвываем то, что она вернёт.

Тебе нужен reflection.

Как он узнаёт, что лямбду надо прицепить к int operation??

Потому, что там один метод.

Что будет, если в интерфейсе больше двух методов?

Оно не скомпилируется.

Как туда запихать больше двух методов?

Использовать полноценные классы вместо лямбд.

Твой код

TwoArgInterface plusOperation = (a, b) -> a + b;
условно эквивалентен коду
TwoArgInterface plusOperation = new TwoArgInterface(){
  @Override
  public int operation(int a, int b) {
    return a + b;
  }
можешь считать это синтаксическим сахаром. Строго говоря это не совсем так, но в данном случае значения не имеет. Если тебе не хватает этого сахара, используй полный синтаксис.