2015-10-25 4 views
-2

Я не хочу, чтобы перекомпилировать код каждый раз, когда изменения лямбда-выражения, есть ли способ я могу передать лямбда-выражение из внешнего файла (текст/XML)Lambda Выражение в Java 8

Для экс: Старый Лямбда выражение

(Car car) -> "red".equals(car.getColor()) 

Новое обновление выражение Lambda

(Car car) -> "red".equals(car.getColor() && "100".equals(car.getPower()) 

есть ли время выполнения компиляции лямбда-выражения поддерживается Java?

+2

Что вы подразумеваете под «когда оно меняется»? Как меняется? –

+1

Обычно этот комментарий открывается с помощью «Добро пожаловать в переполнение стека!». но вы были на сайте более трех лет, задали пять предыдущих вопросов и отправили два ответа. В любом случае: пожалуйста, примите [тур], осмотритесь и прочитайте [помощь], в частности [* Как задать хороший вопрос?] (/ Help/how-to-ask) –

+0

Возможно для компиляции класса (содержащего лямбда или что-то еще) при запуске Java-программы, затем загрузите и выполните его. Это, однако, довольно сложная процедура. Вполне возможно, что ваша фактическая проблема может быть решена с использованием менее косвенных методов. – laune

ответ

2

В Java каждое выражение лямбда является частью класса. Следовательно, единственный способ, которым может изменяться лямбда-выражение, - это изменение класса-оболочки.

Если исходный код класса изменяется (например, для реализации изменения в выражении лямбда), вам необходимо его перекомпилировать. Вы можете перекомпилировать классы Java во время выполнения; см. Compiling external .java files from within Java. Затем вам необходимо загрузить повторно скомпилированный класс ...

Сказав это, редко бывает хорошей генерировать/компилировать/загружать классы в запущенном приложении. Это сложно, и есть вероятность, что он не «окупится» как оптимизация.

1

Короткий ответ: Нет. Лямбда-выражения являются кодом и должны быть скомпилированы, поэтому вы не сможете их просто настроить. Это не похоже на регулярные выражения.

Более длинный ответ: во-первых, посмотрите, можете ли вы выразить изменения, которые вы ожидаете в качестве конфигурации, а затем настройте только эти переменные. Это возможно только в том случае, если вы можете предвидеть изменения, и они основаны на данных, а не на структурных.

Во-вторых, вы можете использовать шаблон стратегии с фабрикой, чтобы можно было заменить различные реализации во время выполнения. Это позволит вам отказаться от новых реализаций без восстановления полной базы кода:

public class ConfigurableFactory { 
    private final String strategyClassImpl; 

    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { 
     System.out.println(new ConfigurableFactory().getStrategyImpl().doThing()); 
    } 

    public ConfigurableFactory(){ 
     // TODO: Load from config 
     strategyClassImpl ="StrategyImpl"; 
    } 

    public Strategy getStrategyImpl() throws InstantiationException, IllegalAccessException, ClassNotFoundException{ 
     return (Strategy) Class.forName(strategyClassImpl).newInstance(); 
    } 
} 

interface Strategy { 
    String doThing(); 
} 

class StrategyImpl implements Strategy { 
    public String doThing() { 
     return "Strategy 1"; 
    } 
} 

Это не относится к лямбда-выражений, и в режиме реального развития я всегда находил его более приемлемым, чтобы просто изменить код и перестраивать, чем любой тип раскручивающейся обманки.