มีตัวเลือกที่สามคือใช้stream().toArray()
ดูความคิดเห็นภายใต้สาเหตุที่ไม่มีสตรีมมีเมธอด toListเหตุผลที่ไม่ได้มีวิธีการสตรีมมันจะช้ากว่า forEach () หรือ collect () และแสดงออกน้อยกว่า มันอาจได้รับการปรับให้เหมาะสมในรุ่นต่อมาของ JDK ดังนั้นควรเพิ่มที่นี่ในกรณี
ทะลึ่ง List<String>
myFinalList = Arrays.asList(
myListToParse.stream()
.filter(Objects::nonNull)
.map(this::doSomething)
.toArray(String[]::new)
);
ด้วยเกณฑ์มาตรฐานไมโครไมโคร, รายการ 1M, โมฆะ 20% และการแปลงอย่างง่ายใน doSomething ()
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;
}
ผลลัพธ์ที่ได้คือ
ขนาน:
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}
ลำดับ:
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}
แบบขนานโดยไม่มีค่า null และตัวกรอง (ดังนั้นสตรีมSIZED
): toArrays มีประสิทธิภาพที่ดีที่สุดในกรณีดังกล่าวและ.forEach()
ล้มเหลวด้วย "indexOutOfBounds" ใน ArrayList ของผู้รับต้องแทนที่ด้วย.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}