为了账号安全,请及时绑定邮箱和手机立即绑定

Java 8流多个过滤器

Java 8流多个过滤器

明月笑刀无情 2021-05-13 22:38:11
我是Java 8的新手,正在尝试对Streams的需求。我有一个包含数千个Recod的csv文件,我的csv格式是DepId,GrpId,EmpId,DepLocation,NoofEmployees,EmpType===D100,CB,244340,美国,1000,合同D101,CB,543126,美国,1900,永久D101,CB,356147,美国,1800,合同D100,DB,244896,HK,500,半合约D100,DB,543378,HK,100,永久我的要求是使用两个条件过滤记录:a)EmpId以“ 244”开头或EmpId以“ 543”开头b)EmpType是“ Contract”和“ Permanent”我在下面尝试 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设置为“ Permanent”和“ Contract”我是否缺少任何高级选项?
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

你可以这样做


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个标题行。然后使用,字符将其拆分。使用EmpId和过滤掉它EmpType。接下来,再次合并令牌以形成行,最后将每行收集到中List。


查看完整回答
反对 回复 2021-05-19
?
慕容森

TA贡献1853条经验 获得超18个赞

优雅的方式是正则表达式,我现在将略过。使用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());


查看完整回答
反对 回复 2021-05-19
  • 2 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信