2015-04-14 1 views
-2

Как я могу упростить этот шаблон стандартного кода с помощью Java 8 lambdas?Как упростить стандартный код проверки с помощью Java 8?

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

Вы можете написать 'нового ArrayList <>();'. Кроме этого, ничего не приходит в голову. – Nitram

+0

Здесь Лэмбда не поможет. Правильная система проверки, с другой стороны ... – Kayaman

+0

Возможно, вы могли бы рассказать нам, что этот код должен делать вообще .. – user2336315

ответ

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 s в 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());