Có một tùy chọn thứ ba - sử dụng stream().toArray()
- xem các bình luận bên dưới tại sao luồng không có phương thức toList . Hóa ra là chậm hơn forEach () hoặc coll () và ít biểu cảm hơn. Nó có thể được tối ưu hóa trong các bản dựng JDK sau này, vì vậy, thêm nó vào đây chỉ trong trường hợp.
giả định List<String>
myFinalList = Arrays.asList(
myListToParse.stream()
.filter(Objects::nonNull)
.map(this::doSomething)
.toArray(String[]::new)
);
với điểm chuẩn vi mô, mục nhập 1M, null 20% và biến đổi đơn giản trong doS Something ()
private LongSummaryStatistics benchmark(final String testName, final Runnable methodToTest, int samples) {
long[] timing = new long[samples];
for (int i = 0; i < samples; i++) {
long start = System.currentTimeMillis();
methodToTest.run();
timing[i] = System.currentTimeMillis() - start;
}
final LongSummaryStatistics stats = Arrays.stream(timing).summaryStatistics();
System.out.println(testName + ": " + stats);
return stats;
}
kết quả là
song song, tương đông:
toArray: LongSummaryStatistics{count=10, sum=3721, min=321, average=372,100000, max=535}
forEach: LongSummaryStatistics{count=10, sum=3502, min=249, average=350,200000, max=389}
collect: LongSummaryStatistics{count=10, sum=3325, min=265, average=332,500000, max=368}
tuần tự:
toArray: LongSummaryStatistics{count=10, sum=5493, min=517, average=549,300000, max=569}
forEach: LongSummaryStatistics{count=10, sum=5316, min=427, average=531,600000, max=571}
collect: LongSummaryStatistics{count=10, sum=5380, min=444, average=538,000000, max=557}
song song không có null và bộ lọc (vì vậy luồng là SIZED
): toArrays có hiệu suất tốt nhất trong trường hợp đó và .forEach()
không thành công với "indexOutOfBound" trên ArrayList người nhận, phải thay thế bằng.forEachOrdered()
toArray: LongSummaryStatistics{count=100, sum=75566, min=707, average=755,660000, max=1107}
forEach: LongSummaryStatistics{count=100, sum=115802, min=992, average=1158,020000, max=1254}
collect: LongSummaryStatistics{count=100, sum=88415, min=732, average=884,150000, max=1014}