Динамические потоки в Java - PullRequest
       8

Динамические потоки в Java

0 голосов
/ 08 октября 2018

Я играл с динамическим LINQ, и мне было интересно, возможно ли в Java сделать что-то подобное.Например, если я возьму этот рабочий код:

Stream<PoliceShooting> averageAge = peopleShot.stream().filter(t->t.getAge() != null);

Есть ли способ для меня сделать его динамическим, как я мог бы сделать с помощью динамического LINQ

String dynamicGetter = "t.getAge() != null"
Stream<PoliceShooting> averageAge = peopleShot.stream().filter(t->dynamicGetter);

1 Ответ

0 голосов
/ 09 октября 2018

Опираясь на Nashorn, как предложено в Как преобразовать строку в лямбда-выражение? , вы можете определить метод для построения Predicate из кода JavaScript:

public Predicate<Object> convertJSToPredicate(String js) throws ScriptException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    return (Predicate<Object>) engine.eval("new java.util.function.Predicate(function(t) " + js + ")");
}

и затем используйте его как:

String dynamicGetter = "t.getAge() != null";
Stream<PoliceShooting> averageAge = peopleShot.stream()
        .filter(convertJSToPredicate(dynamicGetter));

Конечно dynamicGetter должен быть JavaScript, а не кодом Java, и может обращаться к переданному объекту через переменную t.

Примечаниечто Нашорн устарел в Java 11 .Я бы предположил, что альтернативные реализации придут.

...