第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 8流多個過濾器

Java 8流多個過濾器

明月笑刀無情 2021-05-13 22:38:11
我是Java 8的新手,正在嘗試對Streams的需求。我有一個包含數(shù)千個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過濾員工,但是我擔心的是,因為我使用的包含它可能還會獲取其他數(shù)據(jù),即它將不僅從EmpId列而且還會從其他列獲取數(shù)據(jù)(其他列可能也包含以開頭的數(shù)據(jù)這些數(shù)字)類似地,因為我正在逐行閱讀中合并EmpType,所以我沒有辦法強制將EmpType設(shè)置為“ Permanent”和“ Contract”我是否缺少任何高級選項?
查看完整描述

2 回答

?
一只甜甜圈

TA貢獻1836條經(jīng)驗 獲得超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。


查看完整回答
反對 回復(fù) 2021-05-19
?
慕容森

TA貢獻1853條經(jīng)驗 獲得超18個贊

優(yōu)雅的方式是正則表達式,我現(xiàn)在將略過。使用Stream API的不太優(yōu)雅的方法如下:


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());


查看完整回答
反對 回復(fù) 2021-05-19
  • 2 回答
  • 0 關(guān)注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號