【问题标题】:Java Stream filter with regex not working带有正则表达式的Java Stream过滤器不起作用
【发布时间】:2017-09-07 07:10:58
【问题描述】:

希望有人可以帮助我。我有一个ArrayListInvoice 类。我想要得到的是过滤这个ArrayList 并找到它的一个属性与regex 匹配的第一个元素。 Invoiceclass 如下所示:

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+) 进行过滤,以查找orderNumproperty 中是否有任何非整数格式的值。 所以基本上我正在使用这个流

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

使用ListIntegerString 等,但我还没有找到如何使用POJO。 任何帮助都感激不尽。 美好的一天

【问题讨论】:

  • java8 流没有matches 方法,这段代码有效吗?

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


【解决方案1】:

你快到了。

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

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


如果您已经有一个编译好的 Pattern 并希望重新使用:

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

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 2012-12-09
    • 2016-03-18
    • 2017-02-19
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    相关资源
    最近更新 更多