Groovy эквивалент для Java 8 лямбда-выражение

у меня есть этот интерфейс Java только с одним методом.

// Java Interface
public interface AuditorAware {
    Auditor getCurrentAuditor();
}

я использовал выражение Java 8 Lambda для создания insance AuditorAware следующим образом.

// Java 8 Lambda to create instance of AuditorAware
public AuditorAware currentAuditor() {
    return () -> AuditorContextHolder.getAuditor();
}

Я пытаюсь написать выше реализации Java в Groovy.

Я вижу, что есть много способов реализовать интерфейсы в groovy, как показано в этом Groovy способы реализации интерфейсов документация.

я реализовал выше Java-код для groovy эквивалент с помощью реализации интерфейсов с картой, как показано в вышеупомянутой документации.

// Groovy Equivalent by "implement interfaces with a map" method
AuditorAware currentAuditor() {
    [getCurrentAuditor: AuditorContextHolder.auditor] as AuditorAware
}

но реализация интерфейсов с методом закрытия кажется более краткой, как показано в Примере документации. Однако, когда я пытаюсь реализовать следующее,IntelliJ предметов Неоднозначный Блок Кода.

// Groovy Equivalent by "implement interfaces with a closure" method ???
AuditorAware currentAuditor() {
    {AuditorContextHolder.auditor} as AuditorAware
}

как я могу изменить реализацию Java 8 lambda на эквивалент groovy с помощью " реализовать интерфейсы с закрытием" метод?

2 ответов


прокомментировал Дилан Bijnagte, следующий код работал.

// Groovy Equivalent by "implement interfaces with a closure" method 
AuditorAware currentAuditor() {
    { -> AuditorContextHolder.auditor} as AuditorAware
}

раздел Paramter Примечания of документация по Groovy Closure объяснить это.


можно использовать .& оператор для получения ссылки на метод:

class Auditor { 
  String name 
}

interface AuditorAware { 
  Auditor getCurrentAuditor() 
}

class AuditorContextHolder {
  static getAuditor() { new Auditor(name: "joe") }
}

AuditorAware currentAuditor() {
  AuditorContextHolder.&getAuditor
}

assert currentAuditor().currentAuditor.name == "joe"

в Java 8 вы можете использовать :: для ссылок на метод:

  AuditorAware currentAuditor() {
    return AuditorContextHolder::getAuditor;
  }