Java 获取数组错误的键&;水流条件

Java 获取数组错误的键&;水流条件,java,collections,compiler-errors,java-8,java-stream,Java,Collections,Compiler Errors,Java 8,Java Stream,我想从数组中获取密钥,并将它们放入列表中 V[] values; private List<K> getVals (){ return IntStream.range(arr.length/2,arr.length).filter(i-> arr[i]!=null && i%2==0 ).collect(Collectors.<K>toList());} 我知道,因为它是一个IntStream我在列表中得到int,对吗?我的类型是K,但即使不使

我想从数组中获取密钥,并将它们放入
列表中

V[] values;
private List<K> getVals (){
 return  IntStream.range(arr.length/2,arr.length).filter(i-> arr[i]!=null && i%2==0 ).collect(Collectors.<K>toList());}
我知道,因为它是一个
IntStream
我在列表中得到int,对吗?我的类型是K,但即使不使用泛型,也不会有任何变化

第二个问题:

我想知道如何迭代该数组 并在指定索引上设置数据。 但条件是,如果该索引上已经有一个值,我将重新计算该键。 假设我想写一些类似的东西:

if (arr[i]==0) {
    // do something and return
} else {
    // do something else and return
}

我不明白这里怎么了。我使用的代码与某些Internet页面上的代码相同。

您在lambda中使用的类型是
K
,但数组的类型是
V
。我不知道这些类型的化学需氧量是从哪里来的,但显然它们不兼容。要编译这篇文章,你的第一个问题应该是
V扩展K

List<K> getVals() {
    return IntStream.range(arr.length/2, arr.length)
        .filter(i -> arr[i] != null && i%2 == 0)
        .collect(Collectors.<K>toList());
}
如果这样做有效,则在
收集器.toList()调用中可能不需要类型witness

对于第二个问题,您可以使用
数组有条件地设置数组的元素。setAll

int[] arr = ... ;
Arrays.setAll(arr, i -> arr[i] == 0 ? compute() : arr[i]);
这基本上是对数组索引运行
IntStream
的简写。事实上,这就是它的实现方式

或者,在数组索引上写出
IntStream
,过滤掉不想分配的索引,然后在
forEach
中进行分配:

IntStream.range(0, arr.length)
    .filter(i -> arr[i] == 0)
    .forEach(i -> arr[i] = compute());

你说的钥匙是什么意思?数组中没有键,列表中也没有键。我不知道您在尝试什么,但例如,
i%==0
甚至不存在。我没有复制粘贴代码,因此可能会出现一些语法错误,但真正的代码是正确的,完成了。不明白这是如何让事情变得更清楚的:欧威尔,因为正如@Bubletan所说,
i%==0
毫无意义。这使你的问题没有被认真考虑。对不起。我使用一个函数从K计算一个整数值,这是我的索引:)我有一个方法private int calc(kb),它接受不同类型的组件并从中计算一个int值。此int值用作数组中的索引。这不会告诉我谁是
V
int[] arr = ... ;
Arrays.setAll(arr, i -> arr[i] == 0 ? compute() : arr[i]);
IntStream.range(0, arr.length)
    .filter(i -> arr[i] == 0)
    .forEach(i -> arr[i] = compute());