---
title: Java8でIteratorからStreamに変換する方法
tags: ["Java", "Java SE 8", "Stream"]
categories: ["Programming", "Java", "java", "util", "stream"]
date: 2014-12-20T16:15:33Z
updated: 2014-12-20T16:15:33Z
---

いつも忘れるのでメモ

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

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

サイズが固定長の場合は[Spliterators#spliterator(Iterator<? extends T> iterator, long size, int characteristics)](https://docs.oracle.com/javase/jp/8/api/java/util/Spliterators.html#spliterator-java.util.Iterator-long-int-)を使う。

ちなみに`characteristics`(上記例では`ORDERED`)を指定するとストリームが最適化されるみたい。種類は[JavaDoc](https://docs.oracle.com/javase/jp/8/api/java/util/Spliterator.html#field.summary)参照。なんでEnumじゃないんだ

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

``` java
Iterable<T> iterable = ...;
Stream<T> stream = StreamSupport.stream(iterable.spliterator(), false);
```
でOK。
