Java 使用正则表达式的流过滤器不起作用
Java Stream filter with regex not working
希望有人能帮助我。我有一个 ArrayList
一个 Invoice
class。我想要得到的是过滤此 ArrayList
并找到其属性之一与 regex
匹配的第一个元素。
Invoice
class 看起来像这样:
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
。
任何帮助都感激不尽。
美好的一天
你快到了。
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();
希望有人能帮助我。我有一个 ArrayList
一个 Invoice
class。我想要得到的是过滤此 ArrayList
并找到其属性之一与 regex
匹配的第一个元素。
Invoice
class 看起来像这样:
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
。
任何帮助都感激不尽。
美好的一天
你快到了。
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();