Java 8:从List中查找最小值索引

Mub*_*bin 13 java java-8 java-stream

说我有一个包含元素的列表(34, 11, 98, 56, 43).

使用Java 8流,如何找到列表中最小元素的索引(例如,在这种情况下为1)?

我知道这可以在Java中轻松完成list.indexOf(Collections.min(list)).但是,我正在寻找一个类似Scala的解决方案,我们可以简单地说List(34, 11, 98, 56, 43).zipWithIndex.min._2获得最小值的索引.

有没有什么可以使用流或lambda表达式(比如Java 8特定功能)来实现相同的结果.

注意:这仅用于学习目的.我在使用Collections实用程序方法时没有任何问题.

Mis*_*sha 20

import static java.util.Comparator.comparingInt;

int minIndex = IntStream.range(0,list.size()).boxed()
            .min(comparingInt(list::get))
            .get();  // or throw if empty list
Run Code Online (Sandbox Code Playgroud)

正如@TagirValeev在他的回答中提到的,你可以通过使用IntStream#reduce代替而避免拳击Stream#min,但是以掩盖意图为代价:

int minIdx = IntStream.range(0,list.size())
            .reduce((i,j) -> list.get(i) > list.get(j) ? j : i)
            .getAsInt();  // or throw
Run Code Online (Sandbox Code Playgroud)