#java #type-conversion #jexl
#java #преобразование типов #jexl
Вопрос:
Я использую выражения JEXL, чтобы пользователи могли указывать выражения во время выполнения, и мое приложение будет обрабатывать их соответствующим образом. Теперь в качестве особого случая пользователи хотят сравнивать значения с плавающей запятой, однако в контексте JEXL эти переменные содержат строки типа «6.8». Движок JEXL жалуется, что не может обрабатывать строки и числа. Пока все хорошо.
Однако в https://commons.apache.org/proper/commons-jexl/reference/syntax.html Я нигде не вижу никакого намека на преобразование типов.
Есть ли какой-нибудь способ преобразовать строку в float внутри выражения?
Ответ №1:
Итак, я нашел способ решить эту проблему, используя пространства имен функций (см. https://commons.apache.org/proper/commons-jexl/reference/syntax.html#Functions ). Поскольку, похоже, документации по этому вопросу недостаточно, я публикую решение.
Создайте JexlEngine с дополнительными функциями, добавленными через пространства имен.
Map<String, Object> namespace = new TreeMap<>();
namespace.put("float", Float.class);
JexlBuilder builder = new JexlBuilder();
builder.silent(false);
builder.strict(true);
builder.namespaces(namespace);
JexlEngine engine = builder.create();
С помощью этого вы сможете обрабатывать такие выражения, как
float:parseFloat("10") > 8
таким образом, преобразование типов теперь возможно в формуле.