Java 8 Streams e tente com recursos
Eu pensei que a API de fluxo estivesse aqui para facilitar a leitura do código. Achei algo bastante irritante. oStream
interface (java.util.stream.Stream
) estende oAutoClosable
interface (java.lang.AutoCloseable
)
Portanto, se você deseja fechar corretamente seus fluxos, use o try com recursos.
Listagem 1. Não é muito bom, os fluxos não estão fechados.
public void noTryWithResource() {
Set<Integer> photos = new HashSet<Integer>(Arrays.asList(1, 2, 3));
@SuppressWarnings("resource") List<ImageView> collect = photos.stream()
.map(photo -> new ImageView(new Image(String.valueOf(photo)))).collect(Collectors.<ImageView>toList());
}
Listagem 2. Com 2 tentativas imbricadas :(
public void tryWithResource() {
Set<Integer> photos = new HashSet<Integer>(Arrays.asList(1, 2, 3));
try (Stream<Integer> stream = photos.stream()) {
try (Stream<ImageView> map = stream
.map(photo -> new ImageView(new Image(String.valueOf(photo))))) {
List<ImageView> collect = map.collect(Collectors.<ImageView>toList());
}
}
}
Listagem 3. Comomap
retorna um fluxo, tanto ostream()
e amap()
funções precisam ser fechadas.
public void tryWithResource2() {
Set<Integer> photos = new HashSet<Integer>(Arrays.asList(1, 2, 3));
try (Stream<Integer> stream = photos.stream();
Stream<ImageView> map = stream
.map(photo -> new ImageView(new Image(String.valueOf(photo))))) {
List<ImageView> collect = map.collect(Collectors.<ImageView>toList());
}
}
O exemplo que dou não faz sentido. Eu troqueiPath
para imagens jpg comInteger
, pelo bem do exemplo. Mas não deixe você se distrair com esses detalhes.
Qual é a melhor maneira de lidar com esses fluxos que podem ser fechados automaticamente. Devo dizer que não estou satisfeito com nenhuma das três opções que mostrei. O que você acha? Existem ainda outras soluções mais elegantes?