Я думал, что stream API был здесь, чтобы сделать код более удобным для чтения.
Я нашел что-то очень раздражающее. Интерфейс Stream
(java.util.stream.Stream
) расширяет интерфейс AutoClosable
(java.lang.AutoCloseable
)
Итак, если вы хотите правильно закрыть свои потоки, вы должны использовать try с ресурсами.
Листинг 1. Не очень приятно, потоки не закрыты.
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());
}
Листинг 2. С помощью 2 исправленных попыток: (
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());
}
}
}
Листинг 3. Поскольку map
возвращает поток, функции stream()
и map()
должны быть закрыты.
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());
}
}
Пример, который я даю, не имеет никакого смысла. Я заменил Path
на jpg изображения с помощью Integer
, для примера. Но не позволяйте вам отвлекаться на эти детали.
Каков наилучший способ обойти эти автоматически закрывающиеся потоки. Я должен сказать, что меня не устраивает ни один из трех вариантов, которые я показал. Как вы думаете? Существуют ли еще более элегантные решения?