Muchas veces tenemos un iterable y queremos pasarlo a un stream para aprovecharnos de todas las operaciones que nos aporta el API de streams de java. Por desgracia, Iterable no aporta directamente el método .stream(). Sin embargo, tenemos una opción sencilla para pasar nuestro iterable a un stream:

public void doOperations(Iterable<String> iterable) {

    StreamSupport.stream(iterable.spliterator(), false)
                 .filter(s -> !s.startsWith("a"))
                 .map(String::toUpperCase)
                 .collect(Collectors.toList());

}

Como se puede ver en el ejemplo anterior, a través de la clase StreamSupport (java.util.stream.StreamSupport) podemos crear un stream directamente, sin más que usar el splitIterator que nos proporciona nuestro Iterable.

Si quisieramos, por ejemplo, pasar de un Iterable a una List, bastaría con:

public List<T> iterableToList(Iterable<T> iterable) {

    return StreamSupport.stream(iterable.spliterator(), false)                 
                        .collect(Collectors.toList());

}