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;
}