Java8 の Stream 取得方法あれこれ


Iterator から Stream を得る

Iterable に変換してから Stream を得ることができます。

Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();

Iterable<String> iterable = () -> sourceIterator;
Stream<String> targetStream = StreamSupport.stream(iterable.spliterator(), false);

または以下でもできます。

Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Stream<String> targetStream = StreamSupport.stream(
          Spliterators.spliteratorUnknownSize(sourceIterator, Spliterator.ORDERED), false);

予めサイズが分かっている場合は以下が使えます。

Spliterators#spliterator(Iterator<? extends T> iterator, long size, int characteristics)

配列から Stream を得る

単に Stream.of() が使えます。

String[] strs = {"A", "B", "C", "D"};
Stream.of(strs);

Arrays の static メソッドからも得られます。

Arrays.stream(strs)

配列の一部の要素から Stream を作成するには Arrays.stream(array, from, to) が使えます。

Enumeration から Stream を得る

Collections.list() を経由させることで Stream を得ます。

Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
Stream<NetworkInterface> stream = Collections.list(nets).stream();

文字列を split した結果から Stream を得る

Pattern.splitAsStream() を使うと正規表現で分割した文字列から Stream を直接得られます。

Stream<String> words = Pattern.compile("[\\P{L}]+").splitAsStream(contents);

乱数 Stream を得る

Stream.generate は無限ストリームを生成します。

Stream<Double> ramdoms = Stream.generate(Math::random);

100 個の乱数を得るには以下のように書けます。

Stream<Double> ramdoms = Stream.generate(Math::random).limit(100);

数列の無限 Stream を得る

Stream.iterate() は第一引数にシード、第二引数に UnaryOperator<T> を取ります。

Stream<BigInteger> integers = Stream.iterate(
        BigInteger.ZERO, 
        n -> n.add(BigInteger.ONE));

0 1 2 3 ... のような無限数列が生成することができます。

org.w3c.dom.NodeList からStreamを得る

dom をパースした後の NodeList を Stream で扱いたい場合は以下のようにできます。

Stream<Node> nodeStream = IntStream
     .range(0, nodeList.getLength())
     .mapToObj(nodeList::item);

ソート済みの Stream を得る

ソートされた新たなStremaを得るには sorted() を使う。

String[] words = "Change before you have to".split("\\W");
Stream<String> longestFirst = Stream.of(words)
        .sorted(Comparator.comparing(String::length).reversed());



Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング (impress top gear)

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング (impress top gear)