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

如何优化多类循环调用相同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:03:27