Lambda表达式,如何在自定义方法中将方法作为参数传递

时间:2018-05-17 10:13:33

标签: java lambda java-8

我正在处理个人项目,发现如果应用lambda,我可以复制更少的代码。

所以当前代码看起来像这样:

public UserDto findByUsernameAndPassword(String username, char[] password) {
    Properties props = new Properties();
    props.put("java.naming.factory.url.pkgs","org.jboss.ejb.client.naming");

    try {
        InitialContext ctx = new InitialContext(props);
        String ejbUrl = "ejb:ShopManagmentEAR/ShopManagmentEJB//FrontController!"+IFrontControllerRemote.class.getName();

        IFrontControllerRemote bean = (IFrontControllerRemote) ctx.lookup(ejbUrl);
        return bean.findByUsernameAndPassword(username, password);
    } catch (NamingException e) {
        System.out.println("error");
        e.printStackTrace();
    }
    return null;
}

public List<CategoryDto> getAllCategories(){
    Properties props = new Properties();
    props.put("java.naming.factory.url.pkgs","org.jboss.ejb.client.naming");

    try {
        InitialContext ctx = new InitialContext(props);
        String ejbUrl = "ejb:ShopManagmentEAR/ShopManagmentEJB//FrontController!"+IFrontControllerRemote.class.getName();

        IFrontControllerRemote bean = (IFrontControllerRemote) ctx.lookup(ejbUrl);
        return bean.getAllCategories();
    } catch (NamingException e) {
        System.out.println("error");
        e.printStackTrace();
    }
    return null;
}

正如您所看到的,两种方法的区别仅在于返回的类型和return语句中的方法。所以我很确定lambda可以帮助我清除代码,但不幸的是我无法理解这个主题。

2 个答案:

答案 0 :(得分:2)

您可以创建通用方法

private <T> queryBean(Function<IFrontControllerRemote,T> transform) {
    Properties props = new Properties();
    props.put("java.naming.factory.url.pkgs","org.jboss.ejb.client.naming");

    try {
        InitialContext ctx = new InitialContext(props);
        String ejbUrl = "ejb:ShopManagmentEAR/ShopManagmentEJB//FrontController!"+IFrontControllerRemote.class.getName();

        IFrontControllerRemote bean = (IFrontControllerRemote) ctx.lookup(ejbUrl);

        return transform.apply(bean);

    } catch (NamingException e) {
        System.out.println("error");
        e.printStackTrace();
    }
    return null;
}

通过电话

return queryBean(bean -> bean.findByUsernameAndPassword(username, password));

return queryBean(bean::getAllCategories);

分别

答案 1 :(得分:2)

为了利用lambda表达式(或方法引用),您应该尝试弄清楚两个方法之间的区别如何通过功能接口(即具有单个方法的接口)来表达。

您的两个方法都从IFrontControllerRemote实例获取返回值。因此,通用方法可以接受Function<IFrontControllerRemote,T>,其中T表示返回的值。 Function<IFrontControllerRemote,T>实例将接受IFrontControllerRemote并返回所需的值。

public <T> T getProperty(Function<IFrontControllerRemote,T> retriever) {
    Properties props = new Properties();
    props.put("java.naming.factory.url.pkgs","org.jboss.ejb.client.naming");

    try {
        InitialContext ctx = new InitialContext(props);
        String ejbUrl = "ejb:ShopManagmentEAR/ShopManagmentEJB//FrontController!"+IFrontControllerRemote.class.getName();

        IFrontControllerRemote bean = (IFrontControllerRemote) ctx.lookup(ejbUrl);
        return retriever.apply(bean);
    } catch (NamingException e) {
        System.out.println("error");
        e.printStackTrace();
    }
    return null;
}

现在,要调用方法:

UserDto user = getProperty (b -> b.findByUsernameAndPassword(username, password));

List<CategoryDto> list = getProperty (IFrontControllerRemote::getAllCategories);