将 java 流简化为 return 一条错误消息

simplify java stream to return an error message

你好,我是流媒体新手 java 我正在尝试查找文件中的哪个项目长度超过 12,如果该项目中混合了字母,我想知道这是否可以简化了在 java 中使用流而不使用 java 中的 forEach 方法 stream:

Stream<String> stream = Files.lines(path)

stream.forEach(item -> {
      Pattern pattern = Pattern.compile(REGEX);
      Matcher matcher = pattern.matcher(item);
      if (item.length() > 12) {
             log.error("Item must not exceed 12 numbers {}", item);
             streamMessage.set("Item must not exceed 12 numbers");
      }
      else if (matcher.matches()) {
             log.error("Invalid Item format {}", item);
             streamMessage.set("Invalid Item format");
      }
});

我也需要它来 return log.error 消息和流消息谢谢

编辑:

我已经尝试过 Glare storm 的回答,但是消息被return编辑了:

Stream<String> lengthStream =
                    stream.filter(item -> item.length() > 12);

Pattern pattern = Pattern.compile(REGEX);

Stream<String> letterStream =
                    lengthStream.filter(pattern.asPredicate());
if(lengthStream != null){
       log.error("Item must not exceed 12 numbers");
       message = "Item must not exceed 12 numbers";
}
if(letterStream != null){
       log.error("Invalid Item format");
       message = "Invalid Item format";
}

它总是return项目格式无效,即使文件中没有字母并且长度仅超过 12 个

使用筛选方法:

Stream<String> stream = Files.lines(path);
Stream<String> filteredStream= stream .filter(str -> str.length() > 12);      

Stream<String> matching = filteredStream.filter(str -> Pattern.matches(regex, str));
                    

或:

Stream<String> matching = filteredStream.filter(str -> {
      if(str.length() > 12 && Pattern.matches(regex, str))
          return true;
      return false;
     });

要设置错误消息,您很可能必须抛出一个错误,该错误将 return 您想要的任何消息:

try{
Stream<String> matching = filteredStream.filter(str -> {
      if(str.length() > 11 )
           throw new Exception("Item must not exceed 12 numbers");
      if(Pattern.matches(regex, str))
          return true;
      throw new Exception("Invalid Item format");         
     });
}
catch(Exception e){
   log.error(e);
   message = e;
}