mike-neckのブログ

Java or Groovy or Swift or Golang

JJUG ナイト・セミナー 「ビール片手にLT&納涼会」でLTしてきた #jjug

こんにちわ、みけです。

件のとおり、LTしてきました。

まあ、あまり面白いLTではなかったので、

アレですが、みなさんがStreamをうまく書けるようになるコツを

伝えられたのではないかと、

勝手に思って、自己満足しています。


なお、当日の様子は@yamadamnさんのエースらしいまとめ

JJUG ナイト・セミナー 「ビール片手にLT&納涼会」 #jjug

が詳しいです。

また、資料は@kikutaro_さんJavaEEっぷりが発揮されたエントリー

#jjug ナイト・セミナー「ビール片手にLT&納涼会」に参加&LTしましたー - Challenge JavaEE

にまとまって掲載されています。


さて、僕が適当に出した「九九表をfor使わずに書く」という問題ですが、

@skrbさんが「僕ならiterateを使う。そっちの方が速い」ということで、

iterateを使った奴も書いてみました。

    @Test
    public void 九九表 () {
        final IntValue value = new IntValue();
        IntStream
                .iterate(1, prev -> prev == 0? value.increment() : prev / value.get() == 9? 0 : prev + value.get())
                .limit(90)
                .mapToObj(v -> v == 0? System.lineSeparator() : String.format("%3d", v))
                .forEach(System.out::print);
    }

    class IntValue {
        private int value = 1;
        int increment() {
            value += 1;
            return get();
        }
        int get() {return this.value;}
    }

僕が書くとif文が汚くなりますね…

きっと誰かがいい感じに書いてくれるでしょう|д゚)チラッ


あと、今回のLTではやらなかったのですが、

CompletableFutureをあわせてスリープソートをやるというネタも

作ってあったので紹介しておきます。

    private static final int[] NUMBERS = new int[]{8, 6, 1, 2, 13, 14, 13, 8, 11, 2, 14, 3, 0, 6, 2, 8, 4, 9, 6, 11};

    @Test
    public void スリープソート () throws ExecutionException, InterruptedException {
        final ExecutorService executor = Executors.newFixedThreadPool(NUMBERS.length);
        CompletableFuture.allOf(IntStream.of(NUMBERS)
                .mapToObj(Worker::new)
                .map(worker -> CompletableFuture.runAsync(worker, executor))
                .toArray(CompletableFuture[]::new)).get();
        Worker.result().forEach(System.out::println);
    }

    static class Worker implements Runnable {
        private static final IntValue INDEXER = new IntValue();
        private static final BlockingQueue<Worker> QUEUE = new LinkedBlockingQueue<>(NUMBERS.length);
        private final int value;
        private final int index;
        Worker(int value) {
            this.value = value;
            this.index = INDEXER.get();
            INDEXER.increment();
        }
        @Override
        public void run() {
            try {
                Thread.sleep(value * 100);
                QUEUE.offer(this);
            } catch (InterruptedException ignore) {
            }
        }
        static Queue<Worker> result() {
            return QUEUE;
        }
        @Override public String toString() {
            return "[value = " + String.format("%3d", value) +
                    " / index = " + String.format("%3d", index) + "]";
        }
    }

(IntValueクラスは前掲のもの)

おわり