You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用Lambda表达式在自定义方法中传参以优化重复EJB代码?

用Lambda表达式简化重复的EJB调用代码

你说得没错,这两个方法里的EJB初始化、查找逻辑完全重复,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;
}

简化方案:抽离通用逻辑+Lambda表达式

核心思路是把不变的EJB初始化/查找逻辑抽成一个通用方法,把变化的bean方法调用用Lambda表达式传递进去:

  1. 首先写一个通用的工具方法,它接受一个函数式接口参数,用来执行具体的bean方法调用:
private <T> T executeEjbCall(Function<IFrontControllerRemote, T> action) {
    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);
        // 执行传入的Lambda表达式,返回结果
        return action.apply(bean);
    } catch (NamingException e) {
        System.out.println("error");
        e.printStackTrace();
    }
    return null;
}
  1. 然后改造原来的两个方法,用Lambda或方法引用替代重复代码:
public UserDto findByUsernameAndPassword(String username, char[] password) {
    // Lambda表达式:接收bean实例,调用带参数的方法
    return executeEjbCall(bean -> bean.findByUsernameAndPassword(username, password));
}

public List<CategoryDto> getAllCategories(){
    // 无参数方法用方法引用更简洁,等价于 bean -> bean.getAllCategories()
    return executeEjbCall(IFrontControllerRemote::getAllCategories);
}

为什么这样有效?

  • Function<IFrontControllerRemote, T>是Java内置的函数式接口,它代表一个“输入IFrontControllerRemote,输出T类型结果”的函数,Lambda表达式正好可以实现这个逻辑。
  • 所有重复的初始化、异常处理逻辑都集中在executeEjbCall里,以后如果EJB的配置(比如URL、属性)需要修改,只改这一个地方就行,不用逐个修改业务方法。
  • 业务方法现在只保留核心逻辑,代码更清晰,可读性更强。

内容的提问来源于stack exchange,提问作者Suule

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:19:58