使用Java 8将int数组转换为long数组?

11

我已经尝试了几种方法,但都没有成功。

this.tileUpdateTimeslong[] 类型,而 other.tileUpdateTimesint[] 类型。

this.tileUpdateTimes = Arrays.stream(other.tileUpdateTimes).toArray(size -> new long[size]);
this.tileUpdateTimes = Arrays.stream(other.tileUpdateTimes)
            .map(item -> ((long) item)).toArray();

我该怎么修复这个问题?

2个回答

29

你需要使用 mapToLong 操作。

int[] intArray = {1, 2, 3};
long[] longArray = Arrays.stream(intArray).mapToLong(i -> i).toArray();

或者,正如Holger所指出的那样,在这种情况下,您可以直接使用asLongStream()
int[] intArray = {1, 2, 3};
long[] longArray = Arrays.stream(intArray).asLongStream().toArray();

map方法在原始流上返回相同类型的流。在这种情况下,IntStream.map仍将返回一个IntStream
使用long进行转换。
.map(item -> ((long) item))

如果在IntStream.map中使用的映射器返回一个long,实际上会使代码无法编译,因为预期该映射器返回一个int您需要进行显式转换以将新转换的long转换为int

使用.mapToLong(i -> i),它期望一个返回long的映射器,int i会自动提升long,因此您不需要进行转换。


1
你将如何从 short[] 转换为 Int[]? - Elad Benda
@EladBenda 在流API中没有ShortStream,因此您不会将其用于该任务。但是,您可以使用传统的for循环。 - Tunaki
5
“.mapToLong(i -> i)” 这一步骤已经过时,因为从 intlong 的转换可以通过内部处理解决: Arrays.stream(intArray).asLongStream().toArray() - Holger
@Holger 我想我从来没有注意到那个方法。谢谢! - Tunaki
关键是避免将基本类型装箱。因此,可能使用asLongStream会更好,因为它避免了在map调用中进行大量的装箱/拆箱操作。 - Jilles van Gurp
2
@JillesvanGurp,使用mapToLong不会有任何装箱操作,映射器接受一个int并返回一个long,保持原始类型。阅读代码时,asLongStream()只是mapToLong(i -> i)的简写,但它使代码更清晰,并避免了创建lambda表达式。 - Tunaki

4
这段代码在我的机器上编译成功并返回了预期结果:
    int[] iarr = new int[] { 1, 2, 3, 4, 5, 6 };
    long[] larr = Arrays.stream(iarr)
                        .mapToLong((i) -> (long) i)
                        .toArray();
    System.out.println(Arrays.toString(larr));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接