微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法让一个选项可以在 switch 语句中运行所有以前的情况?

如何解决有没有办法让一个选项可以在 switch 语句中运行所有以前的情况?

例如,如果用户选择选项 1 - 3,它会执行他们自己的特定任务。如果用户输入 4,它会执行所有选项 1 - 3。有没有办法使用 switch 语句来完成此操作,而不必复制和粘贴每种情况下的所有代码

switch (option) {
    case 1: {
        System.out.println("1");
        break;
    }
    case 2: {
        System.out.println("2");
        break;
    }
    case 3: {
        System.out.println("3");
        break;
    }
    case 4: {
        System.out.println("1");
        System.out.println("2");
        System.out.println("3");
        break;
    }
    default: {
        System.out.print("Invalid selection.");
        break;
    }
}

解决方法

switch 语句不允许重复的 case,因此请求的功能只能通过使用 OR 操作的多个 if 语句来实现:

if (option == 1 || option == 4) {
    System.out.println("1");
}
if (option == 2 || option == 4) {
    System.out.println("2");
}
if (option == 3 || option == 4) {
    System.out.println("3");
}

另一种方法可能包括准备某些操作的选项图或操作列表以实现所需的逻辑。

  1. Map<Integer,Runnable> + Predicate.or
// define a map of simple actions
static final Map<Integer,Runnable> actionMap = new LinkedHashMap<>(); 
static {
    actionMap.put(1,()-> System.out.println("1"));
    actionMap.put(2,()-> System.out.println("2"));
    actionMap.put(3,()-> System.out.println("3"));
};

public static void runOption(Integer option) {
    if (option < 1 || option > 4) {
        System.out.println("No action found for option = " + option);
    } else {
        Predicate<Integer> is4 = (x) -> 4 == option;
        
        actionMap.keySet()
            .stream()
            .filter(is4.or(option::equals))
            .map(actionMap::get)
            .forEach(Runnable::run);
    }
}

测试:

IntStream.range(0,6).boxed().forEach(MyClass::runOption);

输出:

No action found for option = 0
1
2
3
1
2
3
No action found for option = 5
  1. Map<Integer,List<Runnable>>getOrDefault

此方法有助于操作的任何组合,而不仅仅是一个操作来运行所有可用操作。

static Runnable 
    action1 = ()-> System.out.println("1"),action2 = ()-> System.out.println("2"),action3 = ()-> System.out.println("3");

static final Map<Integer,List<Runnable>> actionListMap = Map.of(
    1,Arrays.asList(action1),2,Arrays.asList(action2),3,Arrays.asList(action3),4,Arrays.asList(action1,action2,action3)
);

public static void runOptionList(Integer option) {
    actionListMap.getOrDefault(
        option,Arrays.asList(() -> System.out.println("No action found for option = " + option))
    )
    .forEach(Runnable::run);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。