如何优化多类循环调用相同getIcon函数获取ImageIcon的实现?
优化多类静态方法的循环调用(替代嵌套try-catch)
你的嵌套try-catch写法冗余且维护成本高,后续新增类时还要层层嵌套调整。可以利用Java函数式接口,把每个静态方法调用包装成延迟执行的逻辑,存入列表后循环尝试,完全满足你“无需初始化对象即可循环调用”的需求。
方案1:基础循环实现
把每个类的getIcon调用封装为Supplier<ImageIcon>,遍历列表逐个尝试,成功获取后立即终止循环:
import java.util.Arrays; import java.util.List; import java.util.function.Supplier; import javax.swing.ImageIcon; // ... String item = "item"; ImageIcon ii = null; // 封装所有静态方法调用为Supplier列表 List<Supplier<ImageIcon>> iconProviders = Arrays.asList( () -> BattleItemGallery.getIcon(item, false), () -> BerryGallery.getIcon(item, false), () -> EventItemGallery.getIcon(item, false), () -> EvolutionGallery.getIcon(item, false) ); // 循环尝试每个提供者 for (Supplier<ImageIcon> provider : iconProviders) { try { ii = provider.get(); if (ii != null) { break; // 获取成功,终止循环 } } catch (Exception e) { // 调用失败,继续尝试下一个 continue; } }
方案2:Stream流式实现
用Stream API可以写出更紧凑的代码,自动在找到第一个有效结果后停止处理:
import java.util.Arrays; import java.util.Objects; import java.util.function.Supplier; import javax.swing.ImageIcon; // ... String item = "item"; ImageIcon ii = Arrays.asList( () -> BattleItemGallery.getIcon(item, false), () -> BerryGallery.getIcon(item, false), () -> EventItemGallery.getIcon(item, false), () -> EvolutionGallery.getIcon(item, false) ).stream() .map(provider -> { try { return provider.get(); } catch (Exception e) { return null; } }) .filter(Objects::nonNull) .findFirst() .orElse(null);
方案优势
- 可维护性:后续新增类只需在列表中添加一行,无需修改嵌套结构
- 可读性:逻辑清晰,一眼就能看出是依次尝试各个图标提供者
- 灵活性:可随时调整尝试顺序,或扩展返回值校验逻辑
内容的提问来源于stack exchange,提问作者GamingLegion
相关产品推荐
相关产品推荐

