获取阵列错误的关键字&流条件

时间:2015-05-01 19:10:19

标签: java collections compiler-errors java-8 java-stream

我想从数组中获取密钥并将它们放入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
}

我不知道这里有什么问题。我在一些网页上使用相同的代码。

2 个答案:

答案 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());