有没有办法让一个选项可以在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的,因此请求的功能只能通过if使用 OR 操作的多个语句来实现:
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");
}
另一种方法可能包括准备某些操作的选项图或操作列表以实现所需的逻辑。
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
No action found for option = 0
1
2
3
1
2
3
No action found for option = 5
Map<Integer, List<Runnable>>和getOrDefault
此方法有助于操作的任何组合,而不仅仅是一个操作来运行所有可用操作。