在java中将多if-else转换为简单的Lambda表达式代码
我是Lambda的新手,我想把我的简单代码转换成Lambda代码,它包含很多if-else。 谁能解释一下怎么做吗?我真的不知道如何建造它在java中将多if-else转换为简单的Lambda表达式代码,java,lambda,Java,Lambda,我是Lambda的新手,我想把我的简单代码转换成Lambda代码,它包含很多if-else。 谁能解释一下怎么做吗?我真的不知道如何建造它 public void registerModule(HttpServletRequest req, ModuleType moduleType) { LOGGER.debug("Register New Module - " + moduleType.name()); ModuleEntityGenerator moduleEntityGe
public void registerModule(HttpServletRequest req, ModuleType moduleType) {
LOGGER.debug("Register New Module - " + moduleType.name());
ModuleEntityGenerator moduleEntityGenerator = new ModuleEntityGenerator();
try {
if (!req.getParts().isEmpty() && !req.getParameterMap().isEmpty()) {
ModuleEntityDao moduleEntityDao = moduleEntityGenerator.get(req, moduleType);
if (moduleEntityDao != null) {
if (processRegistryDal.getModule(moduleType, moduleEntityDao.getId()) == null) { // Check BA is not already exist
processRegistryDal.addNewModule(moduleEntityDao);
} else { // If already exists just update the current row
processRegistryDal.updateModule(moduleEntityDao);
}
} else {
LOGGER.error("The BA object is null. There is nothing to register");
}
} else {
LOGGER.error("The rest request is empty.No info to register");
}
} catch (IOException e) {
LOGGER.error("IO Error\n" + e.getMessage());
} catch (ServletException e) {
LOGGER.error("Servlet Error\n" + e.getMessage());
}
}
这里与lambda无关,只是一个快速清理提示。早期的
return
s是一种很好的扁平化代码的方法,可以使代码的表面复杂性更接近其实际复杂性。只需颠倒if
条件的含义,调出错误日志,然后返回。看看这一次转换使您的代码变得多么好
public void registerModule(HttpServletRequest req, ModuleType moduleType) {
LOGGER.debug("Register New Module - " + moduleType.name());
try {
if (req.getParts().isEmpty() || req.getParameterMap().isEmpty()) {
LOGGER.error("The rest request is empty.No info to register");
return;
}
ModuleEntityGenerator moduleEntityGenerator = new ModuleEntityGenerator();
ModuleEntityDao moduleEntityDao = moduleEntityGenerator.get(req, moduleType);
if (moduleEntityDao == null) {
LOGGER.error("The BA object is null. There is nothing to register");
return;
}
if (processRegistryDal.getModule(moduleType, moduleEntityDao.getId()) == null) { // Check BA is not already exist
processRegistryDal.addNewModule(moduleEntityDao);
} else { // If already exists just update the current row
processRegistryDal.updateModule(moduleEntityDao);
}
} catch (IOException e) {
LOGGER.error("IO Error\n" + e.getMessage());
} catch (ServletException e) {
LOGGER.error("Servlet Error\n" + e.getMessage());
}
}
如果您只是重新组织代码,就不会得到那么多嵌套的
If
语句
例如,改变条件。而不是:
if (a) {
if (b) {
// code here
} else {
// ERROR
}
} else {
// ERROR
}
如果结构:
if (! a) {
// ERROR
} else if (! b) {
// ERROR
} else {
// code here
}
一个附带的好处是,短“错误”逻辑在if
条件旁边处理,而不是出现在更靠下的某个地方,因为条件和动作之间的距离太远
使用您的代码,可以简化如下:
public void registerModule(HttpServletRequest req, ModuleType moduleType) {
LOGGER.debug("Register New Module - " + moduleType.name());
try {
ModuleEntityDao moduleEntityDao;
if (req.getParts().isEmpty() || req.getParameterMap().isEmpty()) {
LOGGER.error("The rest request is empty.No info to register");
} else if ((moduleEntityDao = new ModuleEntityGenerator().get(req, moduleType)) == null) {
LOGGER.error("The BA object is null. There is nothing to register");
} else if (processRegistryDal.getModule(moduleType, moduleEntityDao.getId()) == null) { // Check BA is not already exist
processRegistryDal.addNewModule(moduleEntityDao);
} else { // If already exists just update the current row
processRegistryDal.updateModule(moduleEntityDao);
}
} catch (IOException e) {
LOGGER.error("IO Error\n" + e.getMessage());
} catch (ServletException e) {
LOGGER.error("Servlet Error\n" + e.getMessage());
}
}
如果将每个
拆分为范围较低的单独方法,该怎么办
主要方法看起来很简单
public void registerModule(HttpServletRequest req, ModuleType moduleType) {
LOGGER.debug("Register New Module - " + moduleType.name());
try {
if (!isRequestEmpty(req))
addOrUpdateModule(createModule(req, moduleType));
} catch (IOException e) {
LOGGER.error("IO Error\n" + e.getMessage());
} catch (ServletException e) {
LOGGER.error("Servlet Error\n" + e.getMessage());
}
}
助手方法。如果开发人员需要详细信息,请查看
private static boolean isRequestEmpty(HttpServletRequest req) {
if (req.getParts().isEmpty() || req.getParameterMap().isEmpty()) {
LOGGER.error("The rest request is empty.No info to register");
return true;
}
return false;
}
private static ModuleEntityDao createModule(HttpServletRequest req, ModuleType moduleType) {
ModuleEntityDao module = new ModuleEntityGenerator().get(req, moduleType);
if (module != null)
return module;
LOGGER.error("The BA object is null. There is nothing to register");
return module;
}
private void addOrUpdateModule(ModuleEntityDao module) {
if(module == null)
return;
if(processRegistryDal.getModule(module.getModuleType(), module.getId()) == null)
processRegistryDal.addNewModule(moduleEntityDao);
else
processRegistryDal.updateModule(moduleEntityDao);
}
这不是lamda,而是通过调用“return”使程序易于阅读,其原理是如果输入无效,则立即退出函数
到
范例
public void registerModule(HttpServletRequest req, ModuleType moduleType) {
try {
LOGGER.debug("Register New Module - " + moduleType.name());
ModuleEntityGenerator moduleEntityGenerator = new ModuleEntityGenerator();
if (req.getParts().isEmpty() || req.getParameterMap().isEmpty()) {
LOGGER.error("The rest request is empty.No info to register");
return;
}
ModuleEntityDao moduleEntityDao = moduleEntityGenerator.get(req, moduleType);
if (moduleEntityDao == null) {
LOGGER.error("The BA object is null. There is nothing to register");
return;
}
if (processRegistryDal.getModule(moduleType, moduleEntityDao.getId()) == null) {
// Check BA is not already exist
processRegistryDal.addNewModule(moduleEntityDao);
return;
}
// If already exists just update the current row
processRegistryDal.updateModule(moduleEntityDao);
} catch (Exception ex) {
LOGGER.error("Error\n" + ex.getMessage());
}
}
在尝试lambda之前,我会先提取方法。为什么您认为使用lambda会改进代码?不会的,我和兰姆达在一起不会更容易的,别这么想
if (a == null || b == null) {
// d
return;
}
// c
public void registerModule(HttpServletRequest req, ModuleType moduleType) {
try {
LOGGER.debug("Register New Module - " + moduleType.name());
ModuleEntityGenerator moduleEntityGenerator = new ModuleEntityGenerator();
if (req.getParts().isEmpty() || req.getParameterMap().isEmpty()) {
LOGGER.error("The rest request is empty.No info to register");
return;
}
ModuleEntityDao moduleEntityDao = moduleEntityGenerator.get(req, moduleType);
if (moduleEntityDao == null) {
LOGGER.error("The BA object is null. There is nothing to register");
return;
}
if (processRegistryDal.getModule(moduleType, moduleEntityDao.getId()) == null) {
// Check BA is not already exist
processRegistryDal.addNewModule(moduleEntityDao);
return;
}
// If already exists just update the current row
processRegistryDal.updateModule(moduleEntityDao);
} catch (Exception ex) {
LOGGER.error("Error\n" + ex.getMessage());
}
}