Java 使用正则表达式的流过滤器不起作用

Java Stream filter with regex not working

希望有人能帮助我。我有一个 ArrayList 一个 Invoice class。我想要得到的是过滤此 ArrayList 并找到其属性之一与 regex 匹配的第一个元素。 Invoiceclass 看起来像这样:

public class Invoice {
   private final SimpleStringProperty docNum;
   private final SimpleStringProperty orderNum;

   public Invoice{
    this.docNum = new SimpleStringProperty();
    this.orderNum = new SimpleStringProperty(); 
}   

   //getters and setters
}

我正在使用此 regex (\D+) 进行过滤,以查找 orderNum属性 中是否有任何值的格式不是整数。 所以基本上我正在使用这个流

    Optional<Invoice> invoice = list
                            .stream()
                            .filter(line -> line.getOrderNum())
                            .matches("(\D+)"))
                            .findFirst();

但它不起作用。任何的想法? 我一直在搜索,我找到了如何使用 pattern.asPredicate(),例如 this:

Pattern pattern = Pattern.compile("...");

List<String> matching = list.stream()
        .filter(pattern.asPredicate())
        .collect(Collectors.toList());

使用 ListIntegerString 等,但我还没有找到如何使用 POJO。 任何帮助都感激不尽。 美好的一天

你快到了。

Optional<Invoice> invoice = list.stream()
  .filter(line -> line.getOrderNum().matches("\D+"))
  .findFirst();

这里发生的事情是您创建了一个用于 filter 流的自定义 Predicate。它将当前 Invoice 转换为布尔结果。


如果您已经编译了 Pattern 并且想要重新使用:

Pattern p = …
Optional<Invoice> invoice = list.stream()
  .filter(line -> p.matcher(line.getOrderNum()).matches())
  .findFirst();