为什么我要从偶数位置的元素中减去 1?我只需要奇数位置(奇数索引)Java

Why do I subtract 1 from the element on an even position? I need only odd positions (odd indexes) Java

我需要你的帮助。我有任务:

return numbers.stream().map(i -> numbers.indexOf(i) % 2 != 0 ? i - 1 : i).filter(i -> i % 2 != 0)
.mapToDouble(Integer::doubleValue).average().orElseThrow(NoSuchElementException::new);

为什么偶数位置的元素要减1?我只需要奇数位置(奇数索引)。 This is the picture

您的问题出在 List#indexOf(Object) 上,它总是 returns 遇到的第一个相等值的索引

现在您正在流中处理您的值,因此减去的值将返回到流中,但不会修改原始 numbers 列表。当流处理第 5 个元素时,在您的示例中再次为 2,它将在 原始未修改列表 中查找索引,因此 numbers.indexOf( 2 ) returns 索引1 是奇数,因此 i - 1 将被执行。

如果您想详细了解如何使用带索引的流,同时避免此类问题,请查看 this tutorial

在您的信息流中,您正在使用 indexOf 方法

Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.

因为 2 出现了两次并且您正在处理 流的元素 而不是 numbers 列表,当您第二次调用该方法时您仍然处理第一个列表的出现,它恰好处于奇数(非偶数)位置。

您应该直接使用索引而不是值。 IntStream.range() 正是您所需要的。

public static Double getOddNumsAverage(List<Integer> numbers) {
        return IntStream.range(0, numbers.size())
                .map(index -> index % 2 != 0 ? numbers.get(index) - 1 : numbers.get(index))
                .filter(value -> value % 2 != 0)
                .average()
                .orElseThrow(NoSuchElementException::new);
}