如何利用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表达式传递进去:
- 首先写一个通用的工具方法,它接受一个函数式接口参数,用来执行具体的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; }
- 然后改造原来的两个方法,用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
相关产品推荐
相关产品推荐

