使用Java流从列表中获取第n个元素

时间:2018-07-08 07:55:46

标签: java java-8 java-stream

我有一个字符串列表,例如"/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)

我能够思考到上面。我最终将如何在所有整数列表中收集第三个元素。

5 个答案:

答案 0 :(得分:4)

只需将每个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。否则,第一List和第三List的长度将为4,并且它们将不通过过滤器。或者,您可以要求l.get(2)的大小为4而不是3(并将l.get(3)更改为sed 's/\//\\\\057/g;s/&/\\\\046/g')。

答案 1 :(得分:4)

使用正则表达式删除除第三项以外的所有词,过滤掉空的内容,瞧!

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());

regex始终匹配整个字符串,并用第三个术语替换它,这被捕获为第2组,但是由于所有内容都是可选的,因此如果没有第三个术语,则第2组(最终结果)为空白。

这种方法只处理字符串,通过避免使用丑陋的数组代码来简化事情。

答案 2 :(得分:3)

你快到了。

过滤大小为3的列表后,获取第三个元素并将其转换为Integer。

此外,请注意,拆分字符串/100/200将给您一个{<1>}(String[]),其中空字符串为第一个元素。因此,我使用["", "100", "200"]

跳过了第一个元素
skip(1)

答案 3 :(得分:3)

您不需要制作中间列表。而是将每个字符串变成一个空的流或仅包含 <form> <label for="name" >Name of product</label> <input type="text" id="name" class="input-product"> <label for="price">Price of product</label> <input type="text" id="price" class="input-product"> <label for="count">Count of product</label> <input type="text" id="count" class="input-product"> <button id="add">Add</button> </form>的第n个元素,并使用skip(n).limit(1)将所有小的流合并在一起:

flatMap

答案 4 :(得分:0)

您可以像这样使用skiplimit轻松实现它,

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操作而创建的第一个空元素。