[英]Use Java streams to get nth element from a list
我有一個字符串列表,如"/100" "/100/200"
。 我希望用/
分割這些字符串,然后得到一個整數列表列表,如[[100],[100,200]]
。 我想遍歷這個列表列表,如果該列表足夠長,則從每個列表中獲取第n個元素,否則移動到下一個列表。
眾所周知,每個內部列表的長度n
最大。
示例:
n= 3
slashString -> "/100/200/300","/200/300","/100/200/400"
在上面的例子中,我想要一個整數列表為300,400
。
List<Integer> output = slashString.stream()
.map(x->Arrays.stream(x.split("/")).collect(Collectors.toList()))
.filter(x->x.size()==3)
我能夠思考到上面。 我最終如何在所有整數列表中收集第3個元素。
只是每個地圖List
到的第三個元素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());
請注意,您必須消除輸入String
的前導/
。 否則,第1和第3 List
的長度將為4,並且它們不會通過過濾器。 或者您可以要求List
大小為4而不是3(並將l.get(2)
更改為l.get(3)
)。
使用正則表達式刪除除第三個術語以外的所有術語,過濾掉空,瞧!
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個術語,它被捕獲為組2,但由於所有內容都是可選的,因此如果沒有第3個術語,則組2(最終結果)為空。
這種方法只處理Strings,它通過避免丑陋的數組代碼來保持簡單。
你快到了。
過濾大小為3的列表后,獲取第三個元素並將其轉換為整數。
另請注意,拆分String /100/200
將為您提供一個String[]
( ["", "100", "200"]
),並將空字符串作為第一個元素。 所以,我跳過第一個元素使用skip(1)
List<Integer> result = slashString.stream()
.map(x-> Arrays.stream(x.split("/"))
.skip(1)
.collect(Collectors.toList()))
.filter(x -> x.size() >= 3)
.map(list -> Integer.valueOf(list.get(2)))
.collect(Collectors.toList());
您不需要制作中間列表。 而是將每個字符串轉換為空的流或僅包含skip(n).limit(1)
的第n個元素,並使用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());
您可以使用skip
和limit
輕松實現它,如此
final int elementToFetch = 3;
List<Integer> selectedVals = slashString.stream()
.map(s -> Arrays.stream(s.split("/")).skip(elementToFetch).limit(elementToFetch + 1)
.map(Integer::valueOf).collect(Collectors.toList()))
.flatMap(List::stream)
.collect(Collectors.toList());
上述解決方案還將優雅地處理由於split
操作而創建的第一個空元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.