【问题标题】:Is it possible to access the indexes of a List using Java 8 Streams filter? [duplicate]是否可以使用 Java 8 Streams 过滤器访问列表的索引? [复制]
【发布时间】:2020-02-23 04:42:23
【问题描述】:

是否可以使用 Streams 过滤器访问列表的索引? 我的意思是......我知道可以使用循环(while、for 等)来做到这一点,但是当它变成 Stream 时,就好像 List 会丢失有关索引的信息。

我认为是这样的:

list.stream().filter(x -> x > 100)
    .fiter(--getIndexOfEachValue--)
    .collect(Collectors.toList())

如果我有 List=[10,200,30,150,400,30]...

我希望结果=[1,3,4]

【问题讨论】:

  • 请解释一下输入和输出。
  • 为什么以后还需要索引。考虑您想要对集合进行的进一步计算可能会有所帮助。也许您可以将它们集成或附加到集合管道中,而不是稍后引用原始集合。顺便提一句。在进行过滤之前,您可以轻松地创建一对索引和值的流。
  • 看来Java中没有内置zipWithIndex(这可能表明通常有更好的方法不需要索引),所以你必须做这样的事情:gist.github.com/danilomo/999c9d209e97218fe58c8a9042ca1261
  • @aschoerk 在我最初的问题中,我提到了“列表/地图”..我不知道为什么 Stefan Zobei 更改它..是的,我知道在地图中没有索引..是键..但我想利用流搜索的速度并获取索引/键...你知道有时键是字符串,我也在探索流的可能性。
  • @JonathanMarin 如果你有一个 Map,这更容易,entrySet().stream() 已经给你键/值对,你可以过滤任何一个。

标签: java java-8 java-stream


【解决方案1】:

不,这是不可能的。 stream() 调用产生一个值流。由于列表中的值不是唯一的,因此无法将它们映射到原始列表中的唯一位置。


您可以将示例编码为:

list.stream().filter(x -> x > 100)
    .map(x -> list.indexOf(x))
    .collect(Collectors.toList())

但请记住:

  • 这不是使用流来获取元素索引:它是在进行查找,
  • 因此,它是一个O(N^2) 算法,并且
  • 如果list 中的元素不是唯一的,您将得到意想不到的结果。

另一种方法是创建列表的下标流。或者简单地遍历列表。这是前者的一个例子:

IntStream.range(0, list.size())
     .filter(i -> list.get(i) > 100)
     .boxed()
     .collect(Collectors.toList());

请注意,我们正在为列表而不是列表元素流式传输索引。如果列表元素不唯一,它将起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 2014-07-26
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多