Java8でIteratorからStreamに変換する方法

いつも忘れるのでメモ

IteratorからSpliteratorに変換するのがポイント。

Iterator<T> iterator = ...;
Stream<T> stream = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false);

サイズが固定長の場合はSpliterators#spliterator(Iterator<? extends T> iterator, long size, int characteristics)を使う。

ちなみにcharacteristics(上記例ではORDERED)を指定するとストリームが最適化されるみたい。種類はJavaDoc参照。なんでEnumじゃないんだ

Iterableの場合は、spliterator()メソッドで直接Spliteratorに変換できるので、

Iterable<T> iterable = ...;
Stream<T> stream = StreamSupport.stream(iterable.spliterator(), false);

でOK。