有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java获取数组错误和流条件的键

我想从数组中获取密钥并将它们放入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,我在我的列表中得到int,对吗?我的类型是K,但即使不使用泛型,也不会有任何变化

第二个问题:

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

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

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


共 (2) 个答案

  1. # 1 楼答案

    您正在lambda中使用类型K,但数组的类型为V。我不知道这些类型的化学需氧量是从哪里来的,但显然它们不兼容。要编译此文件,您应该有V extends K

  2. # 2 楼答案

    第一个问题,

    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,它没有一个argcollect方法。如果要收集到List,则需要将int值从IntStream转换为引用类型的对象。我不知道如何从数组中得到K的值。Karr的元素类型吗?如果是这样,那么您应该像这样使用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());
    }
    

    如果这样做有效,那么在Collectors.toList()调用中可能不需要类型witness<K>

    对于第二个问题,您可以使用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());