我在Java 8中有一個方法create(Environment env)
,它有多個語句。現在我需要重寫方法來添加支持新的migration
功能。Java 8中的條件lambda執行
要添加支持的migration
只是表示:
如果
Environment env
對象有場migration
設置爲true
不 在create
函數執行一些代碼。
這就是爲什麼我包裝這些代碼塊:
protected Environment create(Environment env)
{
statements;
if (!env.isForMigrate()) {
// executed only if it's NOT a migration
statements;
// for example: imh.create(ve)
// or: newEnv.setAps(env.getAps());
}
...
statements;
if (!env.isForMigrate()) {
// executed only if it's NOT a migration
statements;
}
...
and so on...
}
這些代碼塊我廣泛分佈create
功能。因此,我必須爲多個代碼塊添加條件執行。
在使用lambda表達式的情況下,我可以獲得一些優勢嗎? Java 8中是否有任何模式?
我的本意是寫的是這樣的:
final Predicate<T> forMigrate = (func) -> {
// closure for Environment env
if (env.isForMigrate()) {
func(); // execute passed statements
}
}
...
forMigrate({
Environment newEnv = apsh().envh().im2aps(ve);
newEnv.setAps(env.getAps());
newEnv.setOsId(env.getOsId());
});
因此我希望得到lambda表達式,而我可以傳遞的任何代碼塊。只有當它不是migration
時,lambda表達式纔會執行這些語句。
- 我該怎麼寫這個
forMigrate
lambda函數? - 在這個例子中,使用lambda表達式與舊的
if (...) {}
語句有什麼優勢?
注:
- 我不控制
Environment
類,它是自動生成的XML文件。 - 我想最大限制範圍
forMigration
- 只在create
(不要讓它在任何地方可見) - 這就是爲什麼我要分配lambda表達式到變量:final ... forMigrate = (...) -> { ... }
。 - 我想爲
Environment
使用詞法作用域,不要直接將它傳遞給lambda。從lambda定義的地方使用它。
原有功能create
:
protected Environment create(Environment env)
{
if(env.getHostname()!=null && env.getHostname().endsWith(".")){
String normalizedHostname = env.getHostname().substring(0, env.getHostname().length() - 1);
env.setHostname(normalizedHostname);
}
Ve ve = apsh().envh().aps2im(env);
if (ve.getHostname() == null) {
ve.setHostname(ve.getName());
}
List<String> apps = env.getApps();
Boolean passwordSet = false;
imh.create(ve);
ve = imh.getVe(ve.getCustomerId().intValue(), ve.getName());
if(env.getPassword()!= null && !env.getPassword().isEmpty()){
try{
imh.setVePassword(ve.getCustomerId(), ve.getName(), env.getPassword());
passwordSet = true;
} catch(Exception ex){
logger.error("Failed to set password for VE: " + env.getName(), ex);
}
}
if (!apps.isEmpty()) {
try {
imh.setVeApps(ve.getCustomerId().intValue(), ve.getName(), apps);
} catch (Exception ex) {
logger.error("Failed to install applications VE: {}", ex);
}
}
VeFacade vef = vehFactory.create(ve.getCustomerId(), ve.getName());
vef.operation("start");
ve = imh.getVe(ve.getCustomerId().intValue(), ve.getName());
Environment newEnv = apsh().envh().im2aps(ve);
newEnv.setAps(env.getAps());
newEnv.setOsId(env.getOsId());
newEnv.setSample(env.getSample());
newEnv.setHosting(env.getHosting());
newEnv.setDomain(env.getDomain());
newEnv.getStatus().setUptime(Long.valueOf(new Date().getTime()));
newEnv.setPassword(null); //prevent password from being saved in DB
newEnv.setPasswordSet(passwordSet);
apsh().envh().fillOsData(newEnv, apsh().teh().getOs(newEnv.getOsId()));
apsh().envh().synchPublicAddresses(newEnv, ve);
apsh().dnsh().synchDomainRecords(newEnv);
logger.info("Environment '{}' successfully created", newEnv.getName());
return newEnv;
}
我怎麼會改寫舊的Java 7的風格:
protected Environment create(Environment env)
{
if(env.getHostname()!=null && env.getHostname().endsWith(".")){
String normalizedHostname = env.getHostname().substring(0, env.getHostname().length() - 1);
env.setHostname(normalizedHostname);
}
Ve ve = apsh().envh().aps2im(env);
if (ve.getHostname() == null) {
ve.setHostname(ve.getName());
}
List<String> apps = env.getApps();
Boolean passwordSet = false;
// NOTE: Wrap block of code
if (env.isForMigrate() == false) {
imh.create(ve);
}
ve = imh.getVe(ve.getCustomerId().intValue(), ve.getName());
if(env.getPassword()!= null && !env.getPassword().isEmpty()){
try{
imh.setVePassword(ve.getCustomerId(), ve.getName(), env.getPassword());
passwordSet = true;
} catch(Exception ex){
logger.error("Failed to set password for VE: " + env.getName(), ex);
}
}
if (!apps.isEmpty()) {
try {
imh.setVeApps(ve.getCustomerId().intValue(), ve.getName(), apps);
} catch (Exception ex) {
logger.error("Failed to install applications VE: {}", ex);
}
}
// NOTE: Wrap block of code
if (env.isForMigrate() == false) {
VeFacade vef = vehFactory.create(ve.getCustomerId(), ve.getName());
vef.operation("start");
}
ve = imh.getVe(ve.getCustomerId().intValue(), ve.getName());
Environment newEnv = apsh().envh().im2aps(ve);
// NOTE: Wrap block of code
if (env.isForMigrate() == false) {
newEnv.setAps(env.getAps());
newEnv.setOsId(env.getOsId());
newEnv.setSample(env.getSample());
}
newEnv.setHosting(env.getHosting());
newEnv.setDomain(env.getDomain());
newEnv.getStatus().setUptime(Long.valueOf(new Date().getTime()));
newEnv.setPassword(null); //prevent password from being saved in DB
newEnv.setPasswordSet(passwordSet);
apsh().envh().fillOsData(newEnv, apsh().teh().getOs(newEnv.getOsId()));
apsh().envh().synchPublicAddresses(newEnv, ve);
apsh().dnsh().synchDomainRecords(newEnv);
logger.info("Environment '{}' successfully created", newEnv.getName());
return newEnv;
}
你的問題根本不清楚 - 你可以用編譯的實際代碼(有或沒有lambda表達式)顯示一個例子嗎? – assylias
我添加了更多細節,原始函數代碼和修改後的代碼(它在Java 7中的外觀)。 – likern