オブジェクトの配列の初期化
思い出した
確かJava8になって簡潔に書けるようになってたよなーって思いつつ、結局、思い出せず手癖でループで初期化してたこんな感じのコード。
Object[] array = new Object[10]; for (int i = 0; i < array.length; i++) { array[i] = new Object(); }
Java8以降ではこう書ける。
Object[] array = new Object[10]; Arrays.setAll(array, i -> new Object());
わーい。すっきり。
おまけ
この手の奴はいつも性能が気になっちゃうので測定結果。
cpu=8 useFor : 54 70 35 37 97 38 36 37 36 95 : avg=53.50 useSetAll : 36 36 37 40 36 58 98 75 35 35 : avg=48.60 useParallelSetAll : 241 239 238 238 237 249 236 236 235 236 : avg=238.50
測定したときのソース。
import java.util.Arrays; import java.util.LongSummaryStatistics; public class Test { static final int NUMER_OF_MEASURE = 10; static final int NUMBER_OF_RUN = 10000; static final int ARRAY_LENGTH = 1000; public static void main(String[] args) { int cpuNum = Runtime.getRuntime().availableProcessors(); System.out.printf("cpu=%d%n", cpuNum); report("useFor", Test::useFor); report("useSetAll", Test::useSetAll); report("useParallelSetAll", Test::useParallelSetAll); } static void report(String name, Runnable runner) { measure(runner); // 空回し LongSummaryStatistics statics = new LongSummaryStatistics(); System.out.printf("%-20s:", name); for (int i = 0; i < NUMER_OF_MEASURE; i++) { long time = measure(runner); statics.accept(time); System.out.printf("%,5d", time); } System.out.printf(" : avg=%,5.2f%n", statics.getAverage()); } static long measure(Runnable runner) { long t = System.currentTimeMillis(); for (int i = 0; i < NUMBER_OF_RUN; i++) { runner.run(); } return System.currentTimeMillis() - t; } static void useFor() { Object[] array = new Object[ARRAY_LENGTH]; for (int i = 0; i < array.length; i++) { array[i] = new Object(); } } static void useSetAll() { Object[] array = new Object[ARRAY_LENGTH]; Arrays.setAll(array, i -> new Object()); } static void useParallelSetAll() { Object[] array = new Object[ARRAY_LENGTH]; Arrays.parallelSetAll(array, i -> new Object()); } }