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
}
一串操作可不可以改写成流操作可以作为检验流程的标准
网友评论