ArrayList
类Invoice
。我想要的是过滤这个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
String
,POJO
等,但我还没有找到如何使用{{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();