每次lambda表达式更改时,我都不想重新编译代码,有什么办法可以从外部文件传递lambda表达式(text / xml)
对于前: 老Lambda表达
R.utils:::bunzip2()
新更新的Lambda表达式
(Car car) -> "red".equals(car.getColor())
是否有Java支持的Lambda表达式的运行时编译?
答案 0 :(得分:2)
在Java中,每个lambda表达式都是类的一部分。因此,lambda表达式可以更改的唯一方法是封闭类是否更改。
如果类的源代码发生更改(例如,在lambda表达式中实现更改),则需要重新编译它。您可以在运行时重新编译Java类;见Compiling external .java files from within Java。然后,您必须加载重新编译的类...
话虽如此,在正在运行的应用程序中生成/编译/加载类很少是个好主意。它很复杂,很有可能它不会付出代价。作为优化。
答案 1 :(得分:1)
简短回答:不。Lambda表达式是代码,必须编译,因此您无法仅配置它们。这与正则表达式不同。
更长的答案:首先,看看您是否可以表达您预期的配置更改,然后配置这些变量。只有在能够预测到变化的情况下才能实现这一点,而这些变化是数据驱动的而不是结构性的。
其次,您可以将策略模式与工厂一起使用,以允许在运行时替换不同的实现。这将允许您在不重建完整代码库的情况下放入新实现:
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";
}
}
这并非特定于lambda表达式,在实际开发中,我总是发现只更改代码和重建比任何类型的热部署技巧更容易接受。