Java流过滤器与正则表达式无法正常工作

时间:2017-09-07 07:10:59

标签: java regex java-8 java-stream pojo

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

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());
List

使用Integer StringPOJO等,但我还没有找到如何使用{{1}}。 任何帮助都感激不尽。 美好的一天

1 个答案:

答案 0 :(得分:6)

你几乎就在那里。

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

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

如果您已经编译好了Pattern,那么您希望重复使用:

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