Использование лямбда-выражений с 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);
Другие вопросы по тегам