以管道化的方式来重构循环

· Read in about 1 min · (97 Words)

以管道化容器的方式来重构循环

处理容器最常用的方式是循环操作,但是随着函数式语言的普及,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());
  }