Rad*_*arz 9 python java java-8
3年前,在这里提出了一个类似的问题:是否存在类似于 Python的'枚举'函数的Java?
我非常感谢这个listIterator()解决方案.不过,我现在对新流和lambdas(在JDK 8中引入)做了很多工作并且想知道:有没有一种优雅的方法来获取当前正在处理的元素的索引?我的展示如下,但我觉得它并不特别吸引人.
IntStream.range(0, myList.size())
.mapToObj(i -> doSthWith(myList.get(i), i));
Run Code Online (Sandbox Code Playgroud)
Bri*_*etz 15
之前已经提出过几个问题.关键的观察是,除非你有完美的大小和拆分信息(基本上,如果你的源是一个数组),那么这将是一个仅序贯操作.
你建议的"没有吸引力"的答案:
IntStream.range(0, myList.size())
.mapToObj(i -> doSthWith(myList.get(i), i));
Run Code Online (Sandbox Code Playgroud)
当具有快速O(1)索引获取操作的myList一个ArrayList或其他列表时,实际上是非常有效的,并且干净地并行化.所以我觉得它没有错.
可以有一些解决方法.
您可以使用AtomicInteger每次遍历流的元素时增加的值
final AtomicInteger atom = new AtomicInteger();
list.stream().forEach(i -> System.out.println(i+"-"+atom.getAndIncrement()));
Run Code Online (Sandbox Code Playgroud)
或者使用来自另一个流的迭代器来获取索引(有点像您最初的想法)但更高效,因为您不在get列表上调用.
final Iterator<Integer> a = IntStream.range(0, list.size()).iterator();
list.stream().forEach(i -> System.out.println(i+"-"+a.next()));
Run Code Online (Sandbox Code Playgroud)
嗯,我不确定是否存在其他更好的替代品(当然),但这就是我现在的想法.
请注意,它假设您没有使用并行流.在后一种情况下,不可能这样做以获得元素与列表中的原始索引的映射.
| 归档时间: |
|
| 查看次数: |
2597 次 |
| 最近记录: |