2017-09-07 37 views
2

希望有人可以帮助我。我有一个Invoice类的ArrayList。我试图得到的是过滤这个ArrayList,并找到其中一个属性匹配regex的第一个元素。 的Invoice类看起来是这样的:与正则表达式不工作的Java流过滤器

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

随着IntegerListString等,但我还没有找到如何与POJO做到这一点。 任何帮助将不胜感激。 美好的一天

+0

java8流没有'matches'方法,是该代码有效? – ByeBye

回答

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(); 
+0

谢谢,它工作得很好。 – pburgov