1. Qiita
  2. 投稿
  3. java8

Java8 Stream でズンドコ

  • 7
    いいね
  • 2
    コメント

Java8 ストリーム脳だけど Window がスマートに書けない苦しみ…
最終出力は手抜きになったけど大丈夫だ問題ない

public class ZundokoCheckerWithJava8Stream {
    public static void main(String[] args) {
        final Window<String> window = new Window<>(5);

        Stream.generate(() -> Math.random() <= 0.5 ? "ズン" : "ドコ")
            .map(window::next)
            .peek(System.out::println)
            .filter(z -> z.isPresent() && String.join(",", z.get()).equals("ズン,ズン,ズン,ズン,ドコ"))
            .findFirst();
        System.out.println("キ・ヨ・シ!");
    }

    public static class Window<T> {
        final int size;
        final List<T> elements;

        public Window(int size) {
            this.size = size;
            elements = new ArrayList<>();
        }

        public Optional<List<T>> next(T element) {
            while (wakuwoakeru())
                ;
            elements.add(element);
            return peek();
        }

        private boolean wakuwoakeru() {
            if (elements.size() < size) {
                return false;
            }

            elements.remove(0);
            return true;
        }

        public Optional<List<T>> peek() {
            if (elements.size() < size) {
                return Optional.empty();
            }
            return Optional.of(elements);
        }
    }
}
出力例
Optional.empty
Optional.empty
Optional.empty
Optional.empty
Optional[[ドコ, ドコ, ドコ, ドコ, ズン]]
Optional[[ドコ, ドコ, ドコ, ズン, ズン]]
Optional[[ドコ, ドコ, ズン, ズン, ズン]]
Optional[[ドコ, ズン, ズン, ズン, ドコ]]
Optional[[ズン, ズン, ズン, ドコ, ズン]]
Optional[[ズン, ズン, ドコ, ズン, ズン]]
Optional[[ズン, ドコ, ズン, ズン, ズン]]
Optional[[ドコ, ズン, ズン, ズン, ズン]]
Optional[[ズン, ズン, ズン, ズン, ズン]]
Optional[[ズン, ズン, ズン, ズン, ドコ]]
キ・ヨ・シ!
Comments Loading...