Java从数组中获取范围
Java有数组丢弃的方法吗Java从数组中获取范围,java,arrays,scala,syntax,Java,Arrays,Scala,Syntax,Java有数组丢弃的方法吗在Scala中,我们有:Array.drop(10)。take(16)或者可以获取数组的一系列成员? 例如,在Java中,我只能执行数组[10]。我认为通过流式处理数组来实现这种语义最简单: SomeClass[] sourceArray = /* something */; SomeClass[] result = Arrays.stream(sourceArray).skip(10L).limit(16L).toArray(SomeClass[]::ne
在Scala中,我们有:
Array.drop(10)。take(16)
或者可以获取数组的一系列成员?
例如,在Java中,我只能执行
数组[10]
。我认为通过流式处理数组来实现这种语义最简单:
SomeClass[] sourceArray = /* something */;
SomeClass[] result =
Arrays.stream(sourceArray).skip(10L).limit(16L).toArray(SomeClass[]::new);
有
数组::copyOfRange
:
它有三个参数:
:源数组original
:起始索引,包括from
:结束索引,独占至
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
final int[] source = IntStream.range(0, 10).toArray()
System.out.println(Arrays.toString(source));
final int[] result = Arrays.copyOfRange(source, 3, 8);
System.out.println(Arrays.toString(result));
}
}
其中打印:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7]
有关详细信息,请参见我个人认为,
Arrays::copyOfRange
更简洁、切中要害,并且可能具有更好的性能。@Marv我同意它更简洁,但它确实会给用户留下大量错误/边缘案例处理。这一点很好,但我不会在性能关键的情况下使用它。我刚刚用JMH做了一个快速基准测试,Arrays::copyOfRange
版本快了大约200倍。相当于Scala或Java Streams解决方案:static T[]dropN_takeM(T[]array,int-drop,int-take){return Arrays.copyOfRange(array,Math.min(drop,array.length),Math.max(drop+take,array.length))}
@DodgyCodeException你得再看一眼。对于长度为3的数组,dropN_takeM(arr,10,20)
返回一个包含27
空值的数组。一周中的任何一天我都会破例的!我认为max
也必须是min
才能工作。列表以这种方式操作会容易得多。@OldCurmudgeon同意。列表可以通过List::subList
提供子列表的(可读)视图,这样就不需要像复制数组一样复制备份数据结构。