在java中将多if-else转换为简单的Lambda表达式代码

在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

我是Lambda的新手,我想把我的简单代码转换成Lambda代码,它包含很多if-else。 谁能解释一下怎么做吗?我真的不知道如何建造它

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());
    }
}