3 回答
TA贡献1155条经验 获得超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,并且它们将不通过过滤器。或者,您可以要求List大小为4而不是3(并更改l.get(2)为l.get(3))。
TA贡献2021条经验 获得超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个术语(捕获为第2组),但是由于所有内容都是可选的,因此如果没有第3个术语,则第2组(最终结果)为空白。
这种方法只处理字符串,通过避免使用丑陋的数组代码,使事情变得更简单。
TA贡献1824条经验 获得超8个赞
您无需制作中间列表。而是将每个字符串转换为空或仅包含第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());
添加回答
举报