3 回答

TA貢獻1155條經(jīng)驗 獲得超0個贊
只需將每個映射List到的第3個元素List并收集:
List<Integer> list = Stream.of ("100/200/300","200/300","100/200/400")
.map(x->Arrays.stream(x.split("/")).collect(Collectors.toList()))
.filter(x->x.size()==3)
.map(l->Integer.valueOf (l.get(2)))
.collect(Collectors.toList());
請注意,您必須消除/輸入Strings的前導。否則,1st和3rdList的長度將為4,并且它們將不通過過濾器?;蛘撸梢砸驦ist大小為4而不是3(并更改l.get(2)為l.get(3))。

TA貢獻2021條經(jīng)驗 獲得超8個贊
使用正則表達式刪除除第三項以外的所有項,過濾出空項,瞧!
List<Integer> list = Stream.of("100/200/300", "200/300", "100/200/400")
.map(s -> s.replaceAll("^([^/]/[^/]/)?([^/]+)?(/.*)?", "$2"))
.filter(s -> !s.isEmpty())
.map(Integer::valueOf)
.collect(Collectors.toList());
正則表達式始終匹配整個字符串,并將其替換為第3個術(shù)語(捕獲為第2組),但是由于所有內(nèi)容都是可選的,因此如果沒有第3個術(shù)語,則第2組(最終結(jié)果)為空白。
這種方法只處理字符串,通過避免使用丑陋的數(shù)組代碼,使事情變得更簡單。

TA貢獻1824條經(jīng)驗 獲得超8個贊
您無需制作中間列表。而是將每個字符串轉(zhuǎn)換為空或僅包含第n個元素的流,skip(n).limit(1)并用于flatMap將所有小流合并在一起:
Pattern delimiter = Pattern.compile("/");
int n = 3;
List<Integer> result = slashString.stream()
.flatMap(s -> delimiter.splitAsStream(s).skip(n).limit(1))
.map(Integer::valueOf)
.collect(toList());
添加回答
舉報