Pull to refresh

Comments 7

По-моему, такой вариант более удобен и универсален gist.github.com/Djaler/d3e7e873326a3b96424231af6ab36f72.
Примеры использования:
List<Document> documents = filesModel.getFiles().values().stream()
                .map(rethrowFunction(DocumentFactory::newFileDocument))
                .collect(toList());

return uncheck(() -> MessageDigest.getInstance("MD5"));

Rethrow-методы удобны, когда необходимо явно ловить исключение за пределами Stream-цепочки. Uncheck же необходимы для случаев, когда мы точно знаем, что исключение в данном месте невозможно и нет смысл его перехватывать

Это бред. Никогда не кидайте checked-исключение там, где оно не объявлено. Иначе оно улетит туда, где его никто не будет ждать. Это может быть удобно в трёхстрочных программах, но в серьёзном проекте вы потом не обрадуетесь, когда логи будете читать и баг-репорты разгребать.

Вы не так поняли. rethrow ЗАСТАВЛЯЕТ ловить исключение (или явно объявлять его в сигнатуре) за пределами использования лямбды (в данном примере — стрим-цепочки).

Ну-ну.


Function<File, Document> fn = rethrowFunction(DocumentFactory::newFileDocument);

List<Document> documents = filesModel.getFiles().values().stream()
                .map(fn)
                .collect(toList());

Компилятор заставит бесполезно обернуть в try-catch присваивание, но не заставит обернуть стрим-цепочку. И не говорите мне не делать так. Выносить функции в переменные — нормальный стиль программирования на джаве. Прятать проверяемые исключения — это злоупотребление костылём в системе типов.

Такой кейс даже не проверял, каюсь. Просто не вижу смысла выносить в отдельную переменную метод референс (Если уж сильно хочется, то можно вынести, но rethrow явно оставить в теле лямбды). Да, это костыль. Но что поделать, если лямбды в джаве кривые и не позволяют адекватно работать с исключениями.

У вашего подхода одна существенная проблема: таким образом нельзя сделать ленивые стримы. А Stream API лениво по спецификации. Фактически все действия выполняет терминальная операция (например, collect), а вовсе не промежуточная типа map. Поэтому именно терминальная и будет кидать ваше исключение. Причём если стрим параллельный, оно может быть транслировано из другого потока.

Немного подумал, посмотрел код Djaler и добавил пример с ленивыми вычислениями поверх стандартных стримов, правда получилось сделать только на статических функциях.
Sign up to leave a comment.

Articles