Java 中通过循环判断来替换 if else 的一种方法

概述

本文介绍一种通过循环判断来替换 if else 的一种方法,并介绍该方法的关键点,以及带来的收益。最后通过具体的案例来应用这种方法。

关键点

对象的创建与封装

对象在什么时候创建,什么时候封装,用什么容器进行封装

对象的调用

根据什么条件去调用封装好的对象的方法

  1. if else 的判断逻辑通过 java.util.function.Function 进行封装,参数对外暴露,并返回 boolean 类型,这个代表了 if 中的 表达式,
  2. 通过 KeyValueVo 实体将 Function 和 else 中要返回的内容封装起来
  3. 将所有 KeyValueVo 存储到集合中,通过遍历集合来找到合适的返回内容

带来的好处

  1. 利用 java.util.function.Function 来对业务代码进行解耦
  2. 提高代码的可扩展性和可维护性
  3. 如果集合 size 比较大的话,可以通过多线程来提高执行的速度

现状

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public Integer getTypeByUser(final String user) {
if (user == null) {
return OTHER;
}
final KoneUserData data = koneUserMapper.getByNameEn(user);
if (data == null) {
return OTHER;
}
final String position = data.getPosition();
if (StringUtils.isBlank(position)) {
return OTHER;
}
if (position.contains("测试")) {
return TESTER;
} else if (position.contains("开发") && !position.contains("测试")) {
return DEVELOPOR;
} else if (position.contains("产品") && !position.contains("运营")) {
return PRODUCTOR;
} else if (position.contains("技术支持")) {
return TECHNOLOGY;
} else if (Optional.ofNullable(data.getNameZh()).orElse("").contains("故障台")) {
return GZT;
} else {
return OTHER;
}
}

改进后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 private static final List<KeyValueVo<Function<String, Boolean>, Integer>> TYPE_LIST = new ArrayList<KeyValueVo<Function<String, Boolean>, Integer>>() {{
add(KeyValueVo.<Function<String, Boolean>, Integer>builder().key(position -> position.contains("测试")).value(TESTER).build());
add(KeyValueVo.<Function<String, Boolean>, Integer>builder().key(position -> position.contains("开发") && !position.contains("测试")).value(DEVELOPOR).build());
add(KeyValueVo.<Function<String, Boolean>, Integer>builder().key(position -> position.contains("产品") && !position.contains("运营")).value(PRODUCTOR).build());
add(KeyValueVo.<Function<String, Boolean>, Integer>builder().key(position -> StringUtils.containsAny(position, new String[]{ "技术支持", "Technical Support" })).value(TECHNOLOGY).build());
add(KeyValueVo.<Function<String, Boolean>, Integer>builder().key(nameZh -> Optional.ofNullable(nameZh).orElse("").contains("故障台")).value(GZT).build());
add(KeyValueVo.<Function<String, Boolean>, Integer>builder().key(StringUtils::isBlank).value(OTHER).build());
}};

public Integer getTypeByUser(final String user) {
if (user == null) {
return OTHER;
}
final KoneUserData data = koneUserMapper.getByNameEn(user);
if (data == null) {
return OTHER;
}
return TYPE_LIST.stream().filter(kv -> kv.getKey().apply(data.getPosition())).map(KeyValueVo::getValue).findAny().orElse(OTHER);
}
  • 其中的 Function 为:java.util.function.Function
  • 其中的 KeyValueVo 定义如下
1
2
3
4
5
6
7
8
9
10
11
12
13
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class KeyValueVo<Key, Value> {
private Key key;
private Value value;
}

打赏

  • 微信

  • 支付宝