Использование лямбда-выражений с Rythm Engine
Я пытаюсь использовать лямбда-выражения с Rythm Engine, и он работает в большинстве случаев. Однако это не работает, когда я вызываю тег внутри лямбда-выражения.
Простейший пример:
@test(x -> blabla(x) )
@def test(java.util.function.Function f) {
@f.apply("Test")
}
@def blabla(String text) {
...
Test: @text
...
}
Если я использую конкатенацию строк в лямбда-выражении, это прекрасно работает, но в моем реальном коде мне нужно вызвать сложный тег.
Кто-нибудь знает, как я могу это сделать?
Спасибо.
1 ответ
Наконец-то я нашел решение.
Пересматривая сгенерированный Java-код, можно увидеть, что функция с именем "blabla" (извините, глупое имя) имеет подпись:
public org.rythmengine.utils.RawData blabla(String text)
Таким образом, способ заставить это работать, вызывает "RawData.toString()".
Решение:
@test(x -> blabla( x.toString() )
@def test(java.util.function.Function<String, String> f) {
@f.apply("Test")
}
@def blabla(String text) {
...
Test: @text
...
}
Чтобы избежать ненужных приведений, я добавляю аргументы "String, String" в универсальный класс "java.util.function.Function".
Чтобы проверить код, полезно определить переменную окружения "home.tmp.dir" и использовать необработанный CodeType:
Map<String, Object> conf = new HashMap<>();
conf.put("home.tmp.dir", "./rythm/"); // Generated code
RythmEngine engine = new RythmEngine(conf);
engine.prepare(ICodeType.DefImpl.RAW);