How to Replace Clunky if‑else Chains with Elegant Java Patterns
This article shares practical techniques for reducing verbose if‑else statements in Java, covering strategy‑enum patterns, ternary operators, Stream API methods, Map lookups, enums, and Optional, each illustrated with concise code examples to make conditional logic clearer and more maintainable.
Honestly, I really dislike using a lot of if‑else in code because it feels procedural and makes the code redundant. This note records my practical experiences optimizing if‑else, and will be updated regularly.
1. Use strategy enum to optimize if‑else
Many recommend the Strategy pattern, but creating many strategy classes can be heavy. A better approach combines Strategy with enums.
2. Use ternary operator to optimize if‑else
1) Assigning a value based on a condition:
String id = "";
if (flag) {
id = "a";
} else {
id = "b";
}Using the ternary operator, this can be reduced to a single line: id = flag ? "a" : "b"; 2) Choosing which method to call based on a condition:
Set<String> set1 = new HashSet<>();
Set<String> set2 = new HashSet<>();
if (flag) {
set1.add(id);
} else {
set2.add(id);
}With the ternary operator:
(flag ? set1 : set2).add(id);3. Use Stream to optimize many conditions
JDK 1.8 Stream provides three useful methods:
anyMatch – returns true if any element matches the condition.
allMatch – returns true only if all elements match.
noneMatch – returns true if no element matches.
Example usage:
List<String> list = Arrays.asList("a", "b", "c", "d", "");
boolean anyMatch = list.stream().anyMatch(s -> StringUtils.isEmpty(s));
boolean allMatch = list.stream().allMatch(s -> StringUtils.isEmpty(s));
boolean noneMatch = list.stream().noneMatch(s -> StringUtils.isEmpty(s));When many OR conditions appear, Stream can simplify them:
if (Stream.of(str1, str2, str3, str4, str5, str6).anyMatch(s -> StringUtils.isEmpty(s))) {
// ...
}For AND conditions, use allMatch similarly:
if (Stream.of(str1, str2, str3, str4, str5, str6).allMatch(s -> StringUtils.isEmpty(s))) {
// ...
}4. Use Map to optimize if‑else
When a large number of branches map keys to values, a static immutable map can replace the chain.
public static final Map<String, String> dayMap = ImmutableMap.<String, String>builder()
.put("Monday", "今天上英语课")
.put("Tuesday", "今天上语文课")
.put("Wednesday", "今天上数学课")
.put("Thursday", "今天上音乐课")
.put("Sunday", "今天上编程课")
.build();
public String getDay(String day) {
return dayMap.get(day);
}5. Use enum to optimize if‑else
For simple value look‑ups, an enum can serve the same purpose as a map.
public enum DayEnum {
Monday("今天上英语课"),
Tuesday("今天上语文课"),
Wednesday("今天上数学课"),
Thursday("今天上音乐课"),
Sunday("今天上编程课");
public final String value;
DayEnum(String value) { this.value = value; }
}
public String getDay(String day) {
return DayEnum.valueOf(day).value;
}6. Use Optional to optimize if‑else
To avoid nested null‑checks that can cause NullPointerException, wrap the chain with Optional:
String name = Optional.ofNullable(school)
.flatMap(School::getGrades)
.flatMap(Grades::getStuendt)
.map(Student::getName)
.orElse(null);Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Architect's Guide
Dedicated to sharing programmer-architect skills—Java backend, system, microservice, and distributed architectures—to help you become a senior architect.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
