以管道化容器的方式来重构循环
处理容器最常用的方式是循环操作,但是随着函数式语言的普及,Collection pipeline的是一个可选的替代方案.
日常开发过程中处理对象列表是最普通的任务了,大部分处理这种任务都是使用循环结构,因为循环结构是我们从最初的编程课学到的最基本的控制结构,但是这种任务不是只能用循环来处理,近些年来有人会使用另外一种方法来处理,我称之为管道化容器。这种风格经常被任务是函数编程的一部分,但是我在支持lambda的oo语言中由于函数是一等公民了所以也很容易应用管道化容器的风格。
单循环结构管道化重构
从一个简单的循环开始
Domain对象
@Data
public class Author {
private String name;
private String twitter;
private String company;
public Author(String name, String twitter, String company) {
this.name = name;
this.twitter = twitter;
this.company = company;
}
}
简单循环
List<String> process(List<Author> authorList, String company) {
final List<String> result = Lists.newArrayList();
for (Author author : authorList) {
if (author.getCompany().equals(company)) {
String twitter = author.getTwitter();
if (!Strings.isNullOrEmpty(twitter)) {
result.add(twitter);
}
}
}
return result;
}
重构后版本, 使用后版本,使用filter,map和collect
List<String> prcess2(List<Author> authorList, String company) {
return authorList.stream().filter(a -> a.getCompany().equals(company))
.map(a -> a.getTwitter())
.filter(h -> h != null)
.collect(Collectors.toList());
}