我想在java中迭代一半的数组。是否有任何优雅的方法来缩短它,例如使用for-each循环?
B
答案 0 :(得分:4)
如果使用Java中asList
类的Arrays
方法将数组转换为列表,则可以使用forEach
类中的List
方法。 Java用一行打印出列表中的每个元素,
Arrays.asList(array).forEach(System.out::println);
要打印一半数组,我建议使用copyOfRange
方法将数组的一半复制到一个新数组中,
Integer[] newArray = Arrays.copyOfRange(array, 0, array.length/2);
Arrays.asList(newArray).forEach(System.out::println);
编辑:像Marko Topolnik所指出的那样,我们实际上是从一组基本类型开始而不是对象类型,所以为了使用asList方法,我们将不得不使用int
将数组转换为对象数组(从Integer
到Integer[] integerArray = ArrayUtils.toObject(array);
)。然而,这似乎是乏味/低效的,OP要求更短的方式,所以我的建议是使用Marko的方法,
Arrays.stream(array).limit(array.length/2).forEach(System.out::println);
编辑2:像Amber Beriwal所指出的那样,应该注意的是,虽然上面的单行解决方案由于其简洁性看起来很漂亮,但与OP的原始相比仍然非常低效/慢方法。因此,我想重申Amber的评论,OP和其他人应该坚持原来的for-loop。
for (int i = 0; i < array.length/2; i++)
{
System.out.println(array[i]);
}
答案 1 :(得分:1)
怎么样:
IntStream.range(0, array.length / 2).map(i -> array[i]).forEach(System.out::println);
一行,没有数组副本。
细分:
IntStream.range(0, array.length / 2) //get the range of numbers 0 - (array length)/2
.map(i -> array[i]) //map from index to value
.forEach(System.out::println); //print result
答案 2 :(得分:0)
你发布的答案很好。虽然,我找不到更好的方法来使其保持紧凑,保持性能相同,但性能可以提高。编码时请记住以下做法:
解决方案1:此解决方案将比您的方法慢4-5倍,加Stream
将占用更多空间。
Arrays.stream(array).limit(array.length/2).forEach(System.out::println);
解决方案2 :此解决方案比上述代码和代码(基于我的测试)更快,但Stream
会占用额外空间。而且,它不紧凑。
Arrays.stream(array).limit(array.length / 2).forEach(new IntConsumer() {
@Override
public void accept(int value) {
System.out.println(value);
}
});
解决方案3:正如您所建议的那样。
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
int limit = array.length / 2;
for (int i = 0; i < limit; i++) {
System.out.println(array[i]);
}
建议:不要过去减少性能和内存丢失的LOC。最好跟上能够提供最佳性能的解决方案。