java 8流多个过滤器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 8流多个过滤器相关的知识,希望对你有一定的参考价值。

我是Java 8的新手并尝试了Streams的要求。我有一个csv文件,包含我的csv格式的数千个recods

DepId,GrpId,EmpId,DepLocation,NoofEmployees,EmpType
===
D100,CB,244340,USA,1000,Contract
D101,CB,543126,USA,1900,Permanent
D101,CB,356147,USA,1800,Contract
D100,DB,244896,HK,500,SemiContract
D100,DB,543378,HK,100,Permanent

我的要求是用两个条件过滤记录a)EmpId以“244”开头或EmpId以“543”开头b)EmpType是“合同”和“永久”

我在下面试过

 try (Stream<String> stream = Files.lines(Paths.get(fileAbsolutePath))) {
    list = stream                
        .filter(line -> line.contains("244") || line.contains("543"))
        .collect(Collectors.toList());
     }

它基于244和543过滤员工,但我担心的是,因为我使用包含它可能会获取其他数据,即它不仅会从EmpId列获取数据,还会从其他列获取数据(其他列也可能从数据开始这些数字)

类似于合并EmpType,因为我逐行阅读,我无法强制执行EmpType应该在“永久”和“合同”

我错过了任何高级选项吗?

答案

你可以这样做,

Pattern comma = Pattern.compile(",");
Pattern empNum = Pattern.compile("(244|543)\\d+");
Pattern empType = Pattern.compile("(Contract|Permanent)");
try (Stream<String> stream = Files.lines(Paths.get("C:\\data\\sample.txt"))) {
    List<String> result = stream.skip(2).map(l -> comma.split(l))
            .filter(s -> empNum.matcher(s[2]).matches())
            .filter(s -> empType.matcher(s[5]).matches())
            .map(s -> Arrays.stream(s).collect(Collectors.joining(",")))
            .collect(Collectors.toList());
    System.out.println(result);
} catch (IOException e) {
    e.printStackTrace();
}

首先读取文件并跳过2个标题行。然后使用,字符拆分它。使用EmpIdEmpType过滤掉它。接下来,再次合并标记以形成线,最后将每条线收集到List中。

另一答案

优雅的方式是正则表达式,我现在将跳过。使用Stream API的不太优雅的方式如下:

list = stream.filter(line -> {
    String empId = line.split(",")[2];
    return empId.startsWith("244") || empId.startsWith("543");
}.collect(Collectors.toList());

使用Stream API(由shmosel指出)的简短方法是使用迷你正则表达式。

list = stream.filter(line -> line.split(",")[2].matches("(244|543).*")
             .collect(Collectors.toList());

以上是关于java 8流多个过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 流,过滤掉 Array 并获取计数,然后遍历数组直到前一个 Count 变量

Java 8流限制功能是否有任何等效的Kotlin函数[重复]

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

从 java 8 流中的列表中过滤值

Java 8 Streams API 详解

如何使用 xcode 将快照划分为多个片段,以便让用户与每个片段进行交互?