我想从数组中获取密钥并将它们放入List
。
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 cannot be applied to the given types.
我知道,因为它是IntStream
我在我的列表中注明了,对吧?我的类型是K,但即使不使用泛型,也没有任何变化。
第二个问题:
我想知道如何迭代该数组 并在指定的索引上设置数据。 但条件是,如果在该索引上已经是一个值,我重新计算密钥。 让我们说我想写一些类似的东西:
if (arr[i]==0) {
// do something and return
} else {
// do something else and return
}
我不知道这里有什么问题。我在一些网页上使用相同的代码。
答案 0 :(得分:0)
您在lambdas中使用的类型为K
,但数组的类型为V
。我不知道这些类型来自你的鳕鱼,但显然它们不兼容。要编译它,你应该有V extends K
。
答案 1 :(得分:0)
关于第一个问题,
List<K> getVals() {
return IntStream.range(arr.length/2, arr.length)
.filter(i -> arr[i] != null && i%2 == 0)
.collect(Collectors.<K>toList());
}
这不起作用,因为filter
的输出是IntStream
,它没有单一arg collect
方法。如果要收集到List
,则需要将int
中的IntStream
值转换为引用类型的对象。我不知道你从阵列中得到K
的值。 K
的元素类型是arr
吗?如果是这样,那么您应该使用mapToObj
,如下所示:
List<K> getVals() {
return IntStream.range(arr.length/2, arr.length)
.filter(i -> arr[i] != null && i%2 == 0)
.mapToObj(i -> arr[i])
.collect(Collectors.<K>toList());
}
如果此方法有效,您可能不需要<K>
来电中的类型见证Collectors.toList()
。
对于第二个问题,您可以使用Arrays.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());