[英]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.