Mientras desarrollo mi API que no está vinculada a ningún código heredado, a menudo me encuentro escribiendo métodos que son puramente canales terminados mediante la recopilación de los resultados. Como éste:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
Ahora, la mayoría de los clientes de esta clase generalmente necesitarán la Colección (en este caso, un ImmutableSet) para buscar elementos e iterar sobre ella, pero algunos clientes pueden beneficiarse de tener un Stream para poder canalizar algunas operaciones más. Transmita sin la necesidad de obtener una nueva transmisión de la Colección. Por lo tanto, devolver un Stream les da a los clientes un superconjunto de opciones que tendrían si solo tuvieran la Colección (después de todo, siempre pueden ellos collect()
mismos:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
Este enfoque es tentador para mí, ya que no veo ningún defecto potencial que pueda tener. Sin embargo, nunca he visto este enfoque en ninguna biblioteca (probablemente porque no se lanzaron muchas bibliotecas después de la aparición de Java 8), por lo que me da un poco de miedo adoptarlo. Las clases de biblioteca existentes generalmente devuelven colecciones cuando derivan algo del estado privado.
¿Hay algo malo que pueda suceder si decido devolver un Stream donde mi yo anterior a Java-8 devolvería una Colección? ¿O probablemente estoy haciendo algo así como un antipatrón aquí con todo lo que deriva del estado privado?
fuente