原代码

1
2
3
4
5
6
7
8
9
10
@Data
@NoArgsConstructor
@AllArgsConstructor
public class IntegrateData {
private String pathTypeA;
private String pathTypeB;
private String pathTypeC;
private String pathTypeD;
private String pathTypeE;
}
1
2
3
4
5
6
7
public interface PathType {
String A = "A";
String B = "B";
String C = "C";
String D = "D";
String E = "E";
}

下面定义了一种工厂类的方法,在另外一篇文章中有提到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class FileService {

@Autowired
private FileHandlerFactory fileHandlerFactory;

public void processFiles(IntegrateData integrateData, Map<String,Object> renderData) {
if(!StringUtils.isEmpty(integrateData.getPathTypeA())){
fileHandlerFactory.getFileHandler(PathType.A).handle(integrateData.getPathTypeA(),renderData);
}
if(!StringUtils.isEmpty(integrateData.getPathTypeB())){
fileHandlerFactory.getFileHandler(PathType.B).handle(integrateData.getPathTypeB(),renderData);
}
if(!StringUtils.isEmpty(integrateData.getPathTypeC())){
fileHandlerFactory.getFileHandler(PathType.C).handle(integrateData.getPathTypeC(),renderData);
}
if(!StringUtils.isEmpty(integrateData.getPathTypeD())){
fileHandlerFactory.getFileHandler(PathType.D).handle(integrateData.getPathTypeD(),renderData);
}
if(!StringUtils.isEmpty(integrateData.getPathTypeE())){
fileHandlerFactory.getFileHandler(PathType.E).handle(integrateData.getPathTypeE(),renderData);
}
}
}

优化后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class FileService {
@Autowired
private FileHandlerFactory fileHandlerFactory;

public void processFiles(IntegrateData integrateData, Map<String,Object> renderData) {
final Map<PathType,Optional<String>> dataMap = new HashMap<PathType,Optional<String>>()
{
{
put(PathType.A, Optional.ofNullable(integrateData.getPathTypeA));
put(PathType.B, Optional.ofNullable(integrateData.getPathTypeB));
put(PathType.C, Optional.ofNullable(integrateData.getPathTypeC));
put(PathType.D, Optional.ofNullable(integrateData.getPathTypeD));
put(PathType.E, Optional.ofNullable(integrateData.getPathTypeE));
}
};

dataMap.entrySet().stream()
.filter(data -> data.getValue().isPresent())
.forEach(data -> fileHandlerFactory.getFileHandler(data.getKey())
.handle(data.getValue().get(),renderData));
}
}

说明

  1. 第一点是使用匿名内部类的方式来初始化map,List、Set也可以这样:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    List<String> someList = new ArrayList<String>() 
    {
    {
    for (int i = 0; i < 10; i++)
    {
    add("A" + i);
    }
    }
    };
  2. Optional的使用

  3. Map的遍历方式
  4. 将常量定义在了interface里,也可以用class、enum

Read More

[1] Java 中 HashMap 初始化时赋值
[2] HashMap优雅的初始化方式以及引申
[3] Java8 如何正确使用 Optional
[4] 使用 Java8 Optional 的正确姿势
[5] Java8中Map的遍历方式总结
[6] Java HashMap 遍历方式性能探讨
[7] Java Map遍历方式的选择
[8] Java Interface 是常量存放的最佳地点吗?
[9] Java Interface 是常量存放的最佳地点吗?