我想使用Java 8流和lambda表達式從我的List<String> list
中只提取數字。首先我需要做的是從文件加載列表中加載字符串。之後,我過濾流獲得包含「PL」的字符串。使用流和lambda表達式從文件中提取數字
我的文件:
Jan Kowalski PL 35000
Jiri Prohazka CZ 28000
Anna Malinowska PL 52000
Jozef Bak PL 49999
Helmut Schnittke DE 45000
Kleofas Oginski PL 45000
John Bull US 74000
Lukasz Zolw PL 9400
Franz Beckenbauer DE 83000
Frantisek Kupka CZ 32000
代碼:
List<String> list = new ArrayList<>();
try (Stream<String> stream = Files.lines(Paths.get("file"),Charset.defaultCharset())) {
list = stream
.filter(line -> line.contains("PL"))
.peek(System.out::println)
.collect(Collectors.toList());
}
我認爲最好的辦法,現在是去除從字符串中的所有字母,只留下小數,但我有問題,我應該怎麼辦它。 最終的結果應該讓我把列表的元素解析爲整數,對它們進行排序,並得到前三個元素的總和。 我已經做到了,但我敢肯定有更好的方式來做到這一點(例如只使用一個列表)
List<Integer> iList = new ArrayList<Integer>();
list.forEach(s->
{
s = s.replaceAll("\\D+","");
iList.add(Integer.parseInt(s));
});
Collections.sort(iList);
Collections.reverse(iList);
int sum = 0;
for(int i=0;i<3;i++){
sum=sum+iList.get(i);
}
任何想法如何做到這一點,而無需使用任何額外的名單?
謝謝!這正是我想要做的。 –
尋找文件樣本,似乎''。* PL \\ s +(\\ d +)「'正則表達式會更加健壯。在這種情況下,用'Matcher :: matches'替換'Matcher :: find'也是很好的選擇。 –
這種方法是有狀態的。首先創建一個匹配器,然後調用它的'find'和'group'方法。幸運的是,在Java 9中,會有一個'results'方法,所以'.filter(Matcher :: find)'可以用'.flatMap(Matcher :: results)'替換。甚至可以在一行中找到更多結果時使用。請參閱http://download.java.net/jdk9/docs/api/java/util/regex/Matcher.html#results-- – user140547