如何使用Java 8简化标准验证代码?

时间:2015-04-14 10:58:03

标签: java lambda java-8

如何使用Java 8 lambdas简化此标准代码模板?

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

1 个答案:

答案 0 :(得分:1)

您的代码段未提供足够的信息来建议简化。如果我们假设有很多这些模式和错误消息对,那么如果为这些对准备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());

拥有这样的映射还为更有效地执行实际匹配操作提供了更深层次的准备,即如果我们将正则表达式String编译为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());