希望有人能帮助我。我有一个 Invoice
类的 ArrayList
。我想要得到的是过滤这个 ArrayList 并找到其属性与正则表达式匹配的第一个元素。
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
}
我正在使用此正则表达式
(\\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());
使用Integer
、String
等的List
,但我还没有找到如何使用POJO
。
任何帮助都感激不尽。
美好的一天
最佳答案
你就快到了。
Optional<Invoice> invoice = list.stream()
.filter(line -> line.getOrderNum().matches("\\D+"))
.findFirst();
这里发生的是,您创建了一个自定义谓词
,用于 filter
溪流。它将当前的Invoice
转换为 boolean 结果。
如果您已经拥有想要重复使用的已编译Pattern
:
Pattern p = …
Optional<Invoice> invoice = list.stream()
.filter(line -> p.matcher(line.getOrderNum()).matches())
.findFirst();
关于带有正则表达式的 Java 流过滤器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46090023/