2 回答
![?](http://img1.sycdn.imooc.com/56fb3e3d0001a10301000100-100-100.jpg)
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。
![?](http://img1.sycdn.imooc.com/545865620001c45402760276-100-100.jpg)
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());
添加回答
举报