List の要素の最大値、最小値もリストインデックスを求める

Java の List 要素の置き換え(List の set メソッド実行)でも要件がない限り、
List のインデックスを求める要件などないであろう。

Integer List の最大値のインデックス

IntStream の reduce で求める

Optional<Integer> res = IntStream.range(0, list.size()).boxed().reduce(
	(a, b) -> list.get(a) >= list.get(b) ? a : b
);
// res.get();

同じ値の最大値がある場合、
>= で判定しているので、最初に検出するインデックスが適用される。
> で判定した場合、最後に検出するインデックスが適用される。
同様に最小値のインデックスは

Optional<Integer> res = IntStream.range(0, list.size()).boxed().reduce(
	(a, b) -> list.get(a) <= list.get(b) ? a : b
);
// res.get();

同じ値の最小値がある場合、
<= で判定しているので、最初に検出するインデックスが適用される。
< で判定した場合、最後に検出するインデックスが適用される。

Comparable での書き方、⇒BigDecimalの例
最大値のインデックス

// List<BigDecimal> list

Optional<Integer> res = IntStream.range(0, list.size()).boxed().reduce(
	(a, b) -> list.get(a).compareTo(list.get(b)) >= 0 ? a : b
);
// res.get();

compareTo( ) >= で、最初に検出するインデックス
compareTo( ) > で、最後に検出するインデックス

最小値のインデックス

Optional<Integer> res = IntStream.range(0, list.size()).boxed().reduce(
	(a, b) -> list.get(a).compareTo(list.get(b)) <= 0 ? a : b
);
// res.get();

同じ値の最小値がある場合、
<= で判定しているので、最初に検出するインデックスが適用される。
< で判定した場合、最後に検出するインデックスが適用される。

Collections.max() ⇒ List.indexOf で求める方法

int maxIndex = list.indexOf(Collections.max(list));

indexOf なので、最初に検出するインデックスが適用される。
最後に検出するインデックスを求める場合は、lastIndexOf を使う

int lastmaxIndex = list.lastIndexOf(Collections.max(list));

任意クラスオブジェクトなど、Listの要素の最大最小の比較が、
そのままComparableを実装で求めるものでない場合、
Stream reduce で求める方法に慣れていた方が良いみたいだ。