带有正则表达式的 Java 流过滤器不起作用

标签 java regex java-8 java-stream pojo

希望有人能帮助我。我有一个 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());

使用IntegerString等的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/

相关文章:

java - 匹配(基本)函数声明

java - 如何通过Java程序启动JavaDB?

java - 我怎样才能找到平均分最高的学生的名字? java

java - 定义/设置 JComboBox BasicArrowButton 禁用时的颜色

java - 处理多种文件格式的转换,避免耦合

java - 执行 PBKDF2WithHmacSHA256 + AES/GCM/NoPadding 的最小示例抛出 : javax. crypto.AEADBadTagException:GCM 中的 mac 检查失败

php - 在 mysql 中使用 REGEX 对特定字符进行严格的数字检查

javascript - Regex 密码必须包含字母和数字或符号,最少八个字符

java - 在 java8 中使用 Stream groupingby 按字符串集合分组

java - 使用流对内部对象的 Map 属性进行分组?