美文网首页
程序员修炼之道30-变换式编程

程序员修炼之道30-变换式编程

作者: DZQANN | 来源:发表于2022-02-21 23:44 被阅读0次

Stream流在开发中是经常用到的。比起之前的for循环中放置很多的处理逻辑,并且中间穿插着continue,break,Stream的语法更加简单并且逻辑清晰。

Stream更像是一种规范,要求你不允许container,不允许break,最重要的是不允许一个状态依赖之前的状态。

之前有一个例子,是说一个文件里面的每一行都需要校验,如果有校验没通过的要按行为单位生成Error Msg.

public class Processor {
    public List<String> checkMessage(List<Message> messages) {
        List<String> result = new ArrayList<>();
        for(Message message: messages) {
            if (!checkField1(message.field1)) {
                result.add("Field1 Error" + message.field1);
                continue;
            }
            if (!checkField2(message.field2)) {
                result.add("Field2 Error" + message.field2);
                continue;
            }
            if (!checkField3(message.field3)) {
                result.add("Field3 Error" + message.field3);
                continue;
            }
        }
        return result;
    }
    
    private boolean checkField1(String field1) {
        return false;
    }
    
    private boolean checkField2(String field2) {
        return false;
    }
    
    private boolean checkField3(String field3) {
        return false;
    }
}

public class Message {
    public String field1;
    public String field2;
    public String field3;
}

这种情况下就没有办法转成流操作,因为每一次的check都会变成boolean类型。后来refactor成了这样

public class Processor {
    public List<String> checkMessage(List<Message> messages) {
        return messages.stream()
            .map(this::check)
            .filter(e->!SUCCESS.equals(e.getB()))
            .map(this::toErrorMessage)
            .collect(Collectors.toList());
    }
    
    private String toErrorMessahe(Pair<Message, ProcessResult> pair){
        return "";
    }
    
    private Pair<Message, ProcessResult> check(Message message) {
        if (!checkField1(message.field1)) {
            return new Pair<>(message, FIELD1_ERROR);
        }
        if (!checkField2(message.field2)) {
            return new Pair<>(message, FIELD2_ERROR);
        }
        if (!checkField3(message.field3)) {
            return new Pair<>(message, FIELD2_ERROR);
        }
    }
    
    private boolean checkField1(String field1) {
        return false;
    }
    
    private boolean checkField2(String field2) {
        return false;
    }
    
    private boolean checkField3(String field3) {
        return false;
    }
}

public class Message {
    public String field1;
    public String field2;
    public String field3;
}

public enum ProcessResult {
    SUCCESS, FIELD1_ERROR, FIELD2_ERROR, FIELD3_ERROR
}

一串操作可不可以改写成流操作可以作为检验流程的标准

相关文章

网友评论

      本文标题:程序员修炼之道30-变换式编程

      本文链接:https://www.haomeiwen.com/subject/gninlrtx.html