Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и хранением в базах данных Postgresql и HSQLDB.
Когда вы слышите что-то, вы забываете это.
Когда вы видите что-то, вы запоминаете это.
Но только когда вы начинаете делать это,
вы начинаете понимать это
Старинная китайская поговорка
- Слайды презентации
- Java Tools and Technologies Landscape Report 2016
- Java in 2017 Survey
- Из юниоров в разработчики: получаем первую работу
ВНИМАНИЕ: выбирайте для проекта простой пусть без пробелов и русских букв, например (Windows) c:\projects\topjava\
. Иначе впоследствии будут проблемы
Проект постоянно улучшается, поэтому видео иногда отличается от кода проекта. Изменения указываю после видео: в
UserMeals/UserMealWithExceed
поля изменились наprivate
- Установить ПО (git, JDK8, IntelliJ IDEA, Maven)
- Создать аккаунт на GitHub
- Сделать Fork ЭТОГО проекта (https://github.com/JavaOPs/topjava)
- Сделать локальный репозиторий проекта:
git clone https://github.com/[Ваш аккаунт]/topjava.git
- Открыть и настроить проект в IDEA
- По ходу видео сделать Apply Patch... скаченного патча Prepare_ to_ HW0.patch
- Закоммитить и запушить изменения (commit + push)
- Сделать ветку домашнего задания
- Выполнить задание и залить на GitHub (commit + push)
- Переключиться в основную ветку проекта master.
Реализовать метод UserMealsUtil.getFilteredWithExceeded через циклы (`forEach`):
- должны возвращаться только записи между startTime и endTime
- поле UserMealWithExceed.exceed должно показывать,
превышает ли сумма калорий за весь день параметра метода caloriesPerDay
Т.е UserMealWithExceed - это запись одной еды, но поле exceeded будет одинаково для всех записей за этот день.
- Проверьте результат выполнения ДЗ (можно проверить логику в http://topjava.herokuapp.com , список еды)
- Оцените Time complexity алгоритма. Если она больше O(N), например O(N*N) или N*log(N), сделайте O(N).
- Java 8 Date and Time API
- Алгоритмы и структуры данных для начинающих: сложность алгоритмов
- Time complexity
- Временная сложность алгоритма
- Вычислительная сложность
ВНИМАНИЕ: варианты Optional делайте в UserMealsUtil
в одной ветке в разных методах. Проще делать, проще проверять
Сделать реализацию через Java 8 Stream API.
- Видео: Доступно о Java 8 Lambda
- Java 8: Lambda выражения
- Java 8: Потоки
- Pуководство по Java 8 Stream
- Java 8 Stream API в картинках и примерах
- 7 способов использовать groupingBy в Stream API
- Лямбда-выражения в Java 8
- A Guide to Java 8
- Шпаргалка Java Stream API
- Алексея Владыкин: Элементы функционального программирования в Java
- Yakov Fain о новом в Java 8
- stream.map vs forEach
- Дополнительно
Сделать реализацию со сложностью O(N) (обратите внимание на п.13 замечаний):
- циклом за 1 проход по List<UserMeal>
- без создания копий списка (в том числе модифицированных) и без дополнительных проходов по частям списка
- через Stream API за 1 проход по исходному списку Stream<UserMeal> meals
- возможно дополнительные проходы по частям списка
- нельзя использовать внешние коллекции, не являющиеся частью коллектора или результатами работы stream
- Когда встречаешь что-то непривычное, приходится перестраивать мозги. Например, переход с процедурного на ООП программирование дается непросто. Те, кто не знает шаблонов (и не хотят учить) также их встречают плохо. Хорошая новость в том, что если это принять и начать использовать, то начинаешь получать от этого удовольствие. И тут главное не впасть в другую крайность:
- Если вас беспокоить производительность стримов, обязательно прочитайте про оптимизацию
При использовании Stream API производительность улучшиться только на больших задачах, где возможно распараллеливание. Еще - просто так запустить и померять скорость JVM нельзя (как минимум дать прогреться и запустить очень большое число раз). Лучше использовать какие-нибудь бенчмарки, например JMH, который мы юзаем на другом проекте (Mastejava).
- 1: Код проекта менять можно! Одна из распространенных ошибок как в тестовых заданиях на собеседовании, так и при работе на проекте, что ничего нельзя менять. Конечно при правках в рабочем проекте обязательно нужно проконсультироваться/проревьюироваться у авторов кода (находится по истории VCS)
- 2: Наследовать
UserMealWithExceed
отUserMeal
я не буду, т.к. это разные сущности: Transfer Object и Entity. Мы будет их проходить на 2м уроке. - 3: Правильная реализация должна быть простой и красивой, можно сделать 2-мя способами: через стримы и через циклы. Сложность должна быть O(N), т.е. без вложенных стримов и циклов.
- 4: При реализации через циклы посмотрите в
Map
на методыgetOrDefault
илиmerge
- 5: При реализации через
Stream
заменяйтеforEach
операторомstream.map(..)
- 6: Объявляйте переменные непосредственно перед использованием (если возможно - сразу с инициализацией). При объявлении коллекций используйте тип переменной - интерфейс (Map, List, ..)
- 7: Если IDEA предлагает оптимизацию (желтым подчеркивает), например заменить лямбду на метод-референс, соглашайтесь (Alt+Enter)
- 8: Пользуйтесь форматированием кода в IDEA:
Alt+Ctrl+L
- 9: Перед check-in проверяйте чендж-лист (курсор на файл и Ctrl+D): не оставляйте в коде ничего лишнего (закомментированный код, TODO и пр.). Если файл не меняется (например только пробелы или переводы строк), не надо его чекинить, делайте ему
revert
(Git -> Revert /Ctrl+Alt+Z
). - 10:
System.out.println
нельзя делать нигде, кроме как вmain
. Позже введем логирование. - 11: Результаты, возвращаемые
UserMealsUtil.getFilteredWithExceeded
мы будем использовать в нашем приложении для фильтрации по времени и отображения еды правильным цветом. - 12: Обращайте внимание на комментарии к вашим коммитам в git. Они должны быть короткие и информативные (лучше на english)
- 13: Не полагайтесь в решении на то, что список будет подаваться отсортированным. Такого условия нет.
ВНИМАНИЕ:
- ДЗ первого урока будет связано с созданием небольшого CRUD приложения (в памяти, без DB) на JSP и сервлетах. Введение будет, но предварительное знакомство не помешает.
- основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия!
Все остальное - опционально.
- Basic HTML and HTML5
- Справочник по WEB
- Видео по WEB технологиям
- Изучение JavaScript в одном видео уроке за час
- HTML, CSS, JAVASCRIPT, SQL, JQUERY, BOOTSTRAP
- Введение в программирование на JavaScript
- Стандарты кодирования для HTML, CSS и JavaScript’a
- Основы работы с HTML/CSS/JavaScript
- JavaScript - Основы
- Основы JavaScript
- Bootstrap 3 - Основы
- jQuery для начинающих
- Интуит. Программирование на Java
- 1й урок MasterJava: Многопоточность
- Основы Java garbage collection
- Размер Java объектов
- Введение в Java Reflection API
- Структуры данных в картинках
- Обзор java.util.concurrent.*
- Синхронизация потоков
- String literal pool
- Маленькие хитрости Java
- A Guide to Java 8
- Что нужно знать о бэкенде новичку в веб-разработке
- Туториалы: Spring Framework, Hibernate, Java Core, JDBC
- Основы SQL на примере задачи
- Уроки по JDBC
- Learn SQL
- Интуит. Основы SQL
- Try SQL
- Курс "Введение в базы данных"
- Вопросы по собеседованию, ресурсы для подготовки
- Эффективная работа с кодом в IntelliJ IDEA
- Quizful- тесты онлайн
- Введение в Linux
- Джошуа Блох: Java. Эффективное программирование. Второе издание
- Гамма, Хелм, Джонсон: Приемы объектно-ориентированного проектирования. Паттерны проектирования
- Редмонд Э.: Семь баз данных за семь недель. Введение в современные базы данных и идеологию NoSQL
- Brian Goetz: Java Concurrency in Practice
- G.L. McDowell: Cracking the Coding Interview