Java 8中的Lambda表达式

时间:2015-10-25 07:37:38

标签: java lambda java-8

每次lambda表达式更改时,我都不想重新编译代码,有什么办法可以从外部文件传递lambda表达式(text / xml)

对于前: 老Lambda表达

R.utils:::bunzip2()

新更新的Lambda表达式

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

是否有Java支持的Lambda表达式的运行时编译?

2 个答案:

答案 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表达式,在实际开发中,我总是发现只更改代码和重建比任何类型的热部署技巧更容易接受。