Hay una respuesta mucho mejor que usar spliteratorUnknownSizedirectamente, lo cual es más fácil y obtiene un mejor resultado. Iterabletiene un spliterator()método, por lo que debe usarlo para obtener su spliterator. En el peor de los casos, es el mismo código (la implementación predeterminada lo usa spliteratorUnknownSize), pero en el caso más común, donde Iterableya es una colección, obtendrá un mejor spliterator y, por lo tanto, un mejor rendimiento de transmisión (tal vez incluso un buen paralelismo). También es menos código:
StreamSupport.stream(iterable.spliterator(), false)
.filter(...)
.moreStreamOps(...);
Como puede ver, obtener una transmisión de un Iterable(vea también esta pregunta ) no es muy doloroso.