是否有Java 8等效的Python枚举内置?

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或其他列表时,实际上是非常有效的,并且干净地并行化.所以我觉得它没有错.


Ale*_* C. 6

可以有一些解决方法.

您可以使用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)

嗯,我不确定是否存在其他更好的替代品(当然),但这就是我现在的想法.

请注意,它假设您没有使用并行流.在后一种情况下,不可能这样做以获得元素与列表中的原始索引的映射.

  • 实际上,对于并行流,您(默默地)只是得到错误的答案.馊主意! (2认同)