Он неустанно писал о своей программе, на разных форумах и сайтах. Его избегали как прокаженного, минусили, банили. Но он продолжал. С помощью простого поиска можно было понять, что он бродит по форумам со своей программой едва ли не с момента появления рунета. И пишет о своей чудо программе чуть ли не круглые сутки без перерывов на сон. Такая настойчивость вызывает интерес. А возможно и некоторое уважение к целеустремленности автора. Поддержав его, я столкнулся с неожиданной агрессией сообщества, ощутив себя таким же инородным телом, как и он сам.
Игорь Михайлов @igormich88
Прoгрaммиcт
Generic исключения в лямбда-функциях
5 min
8.6KRecovery Mode
UPD: Добавлен пример с ленивыми вычислениями поверх стандартных стримов.
Как известно из функциональных интерфейсов в Stream API нельзя выбрасывать контролируемые исключения. Если по каким-то причинам это необходимо (например, работа с файлами, базами данных или по сети), приходится оборачивать их в RuntimeException. Это неплохо работает если ошибки игнорируются, но если их необходимо обрабатывать, то код получается громоздкий и трудночитаемый. Я заинтересовался можно ли объявлять интерфейсы и методы с generic исключениями и неожиданно для себя узнал, что можно.
Зададим такой функциональный интерфейс, от стандартного интерфейса Function<A, B> он отличается только наличием третьего generic-типа для бросаемого исключения.
И объявим простенький метод, который преобразует коллекцию используя этот интерфейс, у этого метода также объявлен generic-тип для бросаемого исключения (совпадающий с типом исключения которое может выбросить функциональный интерфейс).
Посмотрим, как будет выглядит обработка исключений с ними в разных случаях.
Как известно из функциональных интерфейсов в Stream API нельзя выбрасывать контролируемые исключения. Если по каким-то причинам это необходимо (например, работа с файлами, базами данных или по сети), приходится оборачивать их в RuntimeException. Это неплохо работает если ошибки игнорируются, но если их необходимо обрабатывать, то код получается громоздкий и трудночитаемый. Я заинтересовался можно ли объявлять интерфейсы и методы с generic исключениями и неожиданно для себя узнал, что можно.
Зададим такой функциональный интерфейс, от стандартного интерфейса Function<A, B> он отличается только наличием третьего generic-типа для бросаемого исключения.
public interface FunctionWithExceptions<A, B, T extends Throwable>{
B apply(A a) throws T;
}
И объявим простенький метод, который преобразует коллекцию используя этот интерфейс, у этого метода также объявлен generic-тип для бросаемого исключения (совпадающий с типом исключения которое может выбросить функциональный интерфейс).
public static <A, B, T extends Throwable> Collection<B> map(Collection<A> source, FunctionWithExceptions<A, B, T> function) throws T {
Collection<B> result = new ArrayList<>();
for (A a : source) {
result.add(function.apply(a));
}
return result;
}
Посмотрим, как будет выглядит обработка исключений с ними в разных случаях.
+11
Когда 2 + 2 = «4»
3 min
20KRecovery Mode
Во время отдыха от отладки JavaScript, я читал статью про особенности PHP и неожиданно задумался каковы же будут результаты сравнения 2 + 2 = «4» для разных языков программирования. И вот что из этого получилось.
Компилятор C выдаёт предупреждение, компилятор C++ ошибку которая превращается в предупреждение если указать флаг -fpermissive.
Под катом для каждого из языков приведена строчка кода, вызвавшая тот или иной результат, с небольшим комментарием.
Бонусом — функции вывода на консоль для этих языков.
Итоговая таблица для тех кто не хочет много читать | |||
Результат | Ошибка компиляции | False | True |
Языки | C++ Pascal FORTRAN-95 Java C# Go Rust Haskel |
C Lisp Python Lua Ruby |
JavaScript PHP Perl |
Компилятор C выдаёт предупреждение, компилятор C++ ошибку которая превращается в предупреждение если указать флаг -fpermissive.
Под катом для каждого из языков приведена строчка кода, вызвавшая тот или иной результат, с небольшим комментарием.
Бонусом — функции вывода на консоль для этих языков.
+11
Information
- Rating
- Does not participate
- Location
- Россия
- Date of birth
- Registered
- Activity