如何用Java8简化标准验证码?

How to simplify standard validation code with Java 8?

如何使用 Java 8 个 lambda 简化这个标准代码模板?

List<String> errors = ArrayList<String>();
String val = obj.getValue();
if ( StringUtils.isNotEmpty(val) ) {
    if ( !val.matches("regex") ) {
        errors.add("error message");
    }
    // more conditions ...
}

您的代码片段没有提供足够的信息来建议简化。如果我们假设,有很多这样的模式和错误消息对,如果您为这些对准备 Map,则可以进行简化,例如

Map<String,String> regex2message=new HashMap<>();
regex2message.put("regex1", "error message1");
regex2message.put("regex2", "error message2");
regex2message.put("regex3", "error message3");
regex2message.put("regex4", "error message4");
regex2message.put("regex5", "error message5");

一旦你准备好这张地图,你就可以像

一样使用它
List<String> errors = new ArrayList<String>();
String val = obj.getValue();
if( val!=null && !val.isEmpty() ) {
regex2message.forEach((regex,message)->{ if(!val.matches(regex)) errors.add(message); });

或使用 Stream API:

List<String> errors = regex2message.entrySet().stream()
    .flatMap(e->val.matches(e.getKey())? null: Stream.of(e.getValue()))
    .collect(Collectors.toList());

拥有这样的映射还可以为更有效地执行实际匹配操作提供更深入的准备,即如果我们将正则表达式 Strings 编译为 Pattern 实例作为准备步骤:

Map<Pattern,String> pattern2message=regex2message.entrySet().stream()
    .collect(Collectors.toMap(e->Pattern.compile(e.getKey()), Map.Entry::getValue));

以后我们可以这样使用这张地图:

List<String> errors = pattern2message.entrySet().stream()
    .flatMap(e->e.getKey().matcher(val).matches()? null: Stream.of(e.getValue()))
    .collect(Collectors.toList());