Архив метки: java

NullPointerException и null в Java 8

Есть объекты:

class Outer {
Nested nested;
Nested getNested() {
return nested;
}
}
class Nested {
Inner inner;
Inner getInner() {
return inner;
}
}
class Inner {
String foo;
String getFoo() {
return foo;
}
}

Есть примитивная проверка:

Outer outer = new Outer();
if (outer != null && outer.nested != null && outer.nested.inner != null) {
System.out.println(outer.nested.inner.foo);
}

Есть новые возможности Java 8:

Optional.of(new Outer())
.map(Outer::getNested)
.map(Nested::getInner)
.map(Inner::getFoo)
.ifPresent(System.out::println);

или (эксепшен будет заменен Optional.empty())

Outer obj = new Outer();
resolve(() -> obj.getNested().getInner().getFoo());
.ifPresent(System.out::println);

Анатомия Play Framework

Продолжая «оперировать» Play Framework в процессе реализации своего первого веб-приложения наткнулся на очень интересный материал «Play, Anatomy of a web framework» (серия статей).

Автор рассказывает про внутренности фреймворка. От запуска приложения, через обработку реквеста и респонса, до сущности changes hot reload (Hot redeploy, моментальной перезагрузки ваших изменений в коде в дев окружении без необходимости что-то пересобирать/перезапускать).

Если первая часть, упомянутая по ссылке выше, рассказывает про последовательность действий, которая происходит при запуске веб-сервера, то во второй части мы уже видим, какой ценой разработчики фреймворка добились того, что мы меняем java-файл, нажимаем в браузере F5 и тут же видим наши изменения. Основная идея: Play очень легкий компонент, который легко перезагрузить, Play — stateless компонент (не хранит состояний между запросами), т.е. можно легко уничтожить объекты/классы и создать их заново в процессе рестарта, ибо ничего не теряется.

Третья статья раскрывает секреты роутинга. Все, что мы пишем в файлу routes, трансформируется в обычный scala код, поэтому так прекрасно работает type safe в IDE и вообще все просто.

Let’s Play

Захотелось изменить жизнь если не к лучшему, то к чему-то новому и взор мой пал на мир Java и что там нынче есть для удобного создания веб-приложений. После прочтения статей типа «Стоит ли использовать Spring Boot в вашем следующем проекте?» обратился к фреймворку Play Framework — The High Velocity Web Framework For Java and Scala.

Прямо на титульной странице сайта проекта можно увидеть видео, показывающее за 20 минут основы разработки для Java и Scala разработчиков (отдельно). Если честно, видео вдохновляющее, но довольно короткое. Тут мне стало интересно, кто на практике использует эту наработку, и наткнулся я на материал от разработчиков linkedin.com. В этом видео рассказываются не только основы и фишки разработки. В самом начале, например, довольно четко выделено, чем же так хорош Play для разработчиков (не надо ковыряться в консоли, парсить огромные логи, ждать деплоя приложения после каждого изменения и т.п.). Где-то на 15-й минуте начинается обсуждение о том, что Play — это event-based фреймворк (в отличие от большинства других, основанных на тредах). И т.п.

В общем, советую посмотреть это видео для получения первой картины о Play и его возможностях.

Для дальнейшего ознакомления с темой можно почитать пару статей:
Developing Scalable Web Applications with Play
Integrating Play for Java and Akka (тут много про асинхронную природу фреймворка)

Да и можно посмотреть еще одно видео от автора первого. «Node.js v.s. Play Framework» by Yevgeny(Jim) Brikman at ScalaMatsuri 2014

Еще есть страничка под названием The Ultimate Guide to Getting Started with the Play Framework со ссылками на материалы по различным аспектам разработки.

Числа Фибоначчи

Для расчета какого-то числа Фибоначчи необязательно брутфорсить, т.е. перебирать всю последовательность методом сложения. Есть прекрасная Формула Бине. По ней прекрасно можно найти n-й элемент последовательности.

А если воспользоваться еще и асимптотикой, т.е. упрощенной формулой, то легко найти нужное число, как ближайшее целое число к результатам этой функции.

Ну и наконец мы можем таким образом найти n, при котором число Фибоначчи перевалит, например, за 1000 знаков, по формуле: i * Math.log10(phi) + Math.log10(1/Math.sqrt(5)) , где phi — так называемое Золотое сечение. Вычисляется по формуле (Math.sqrt(5) + 1) / 2

Почему формула такая? Да потому что следуем условию, что phi**n/sqrt(5) > 10**999 (** — степень, 10**999 — это первое число, у которого 1000 знаков)

Кстати, все это можно вычислить ручкой на бумаге без калькулятора (приблизительно). Квадратные корни вычисляются делением столбиком. Логарифмы тоже можно посчитать.