gpt4 book ai didi

java 8流多个过滤器

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:01:27 27 4
gpt4 key购买 nike

我是 Java 8 的新手,正在尝试对 Streams 提出要求。我有一个包含数千条记录的 csv 文件,我的 csv 格式是

DepId,GrpId,EmpId,DepLocation,NoofEmployees,EmpType===D100,CB,244340,USA,1000,ContractD101,CB,543126,USA,1900,PermanentD101,CB,356147,USA,1800,ContractD100,DB,244896,HK,500,SemiContractD100,DB,543378,HK,100,Permanent

My requirement is to filter the records with two conditionsa) EmpId starts with "244" or EmpId starts with "543"b) EmpType is "Contract" and "Permanent"

I tried below

 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 应位于“永久”和“契约(Contract)”中

我是否缺少任何高级选项??

最佳答案

你可以这样做,

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 中。

关于java 8流多个过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51255889/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com