Як перемагати з Java | Відеозапис вебінару для ЗСУ 🇺🇦

👉 Приєднуйся до Bobocode Community: www.bobocode.com/
________________________________________
Patreon: / bobocode
GitHub: github.com/bobocode-projects
Telegram: t.me/bobocode​
LinkedIn: bit.ly/2RWPQF5
Twitter: bit.ly/3vaQiOl
Тарас в LinkedIn: bit.ly/2ElWg8J
Тарас в Twitter: bit.ly/33Pmuwg
________________________________________
00:00 - початок
01:33 - agenda
03:58 - перед тим як почати
05:03 - питання
05:28 - частина 1. дженеріки
09:23 - що означає що дженеріки стираються?
18:55 - дженеріки в рантаймі Spring-а
28:39 - де зберігається мета-інформація про дженеріки?
32:11 - частина 2. Функціональне програмування
35:33 - метод collect(). Завдання toStack().
38:35 - різниця між лямбдою і метод референс з точки зору байткоду.
40:11 - розбір задачі toStack().
45:08 - робота з базами даних.
46:18 - індексація даних в БД.
56:38 - питання
59:00 - частина 2. Робота з базами через Hibernate
01:08:51 - як зробити коректний мапінг @OneToMany зв’язків щоб уникнути “зайвих” запитів в БД?
01:16:21 - підсумки 2ї частини
01:17:30 - частина 3. Spring Data.
01:20:43 - проблема N+1
01:23:47 - з якими нюансами можна зіткунися при фіксі N+1.
01:29:55 - оптимізація вигрузки унікальниз даних з допомогою distinct і QueryHint.
01:35:19 - анотації @Transactionsl I @Async, нюанси які можуть виникнути
01:42:27 - антипатерн open-in-view і навіщо Spring boot його використовує?
01:46:05 - стрімінг даних з бази.
02:00:14 - питання
02:06:49 - як навчатись ефективно
02:11:45 - про Bobocode
02:14:36 - фінальна частина

Пікірлер: 22

  • @Bobocode
    @Bobocode7 ай бұрын

    🙏🏼 Дякую за Ваші донати: send.monobank.ua/jar/3tSN5fDiMv 💳 Номер картки банки: 5375 4112 0850 2919

  • @5-226
    @5-2267 ай бұрын

    Найкращий канал по Java який я знаходив. Дякую за ваш контент!

  • @Bobocode

    @Bobocode

    7 ай бұрын

    Дякую за таку високу оцінку! 🙏

  • @user-ew8ne4iy9b
    @user-ew8ne4iy9b7 ай бұрын

    Дуже класне відео. Дякую що все так ретельно пояснюєте

  • @Bobocode

    @Bobocode

    7 ай бұрын

    Дякую за коментар і за донат! 🙂

  • @AlexSmith-oe6pr
    @AlexSmith-oe6pr7 ай бұрын

    Як завжди вдячність автору, шикарний контент, поєднання глибини + цікаві практичні приклади, краще що є по Java в українському KZread. Дуже хочеться чути щось подібне від кандидатів на технічному інтервʼю. Вже більш як 2+к переглядів, контент не для початківців, а банка все ще не закрита...

  • @user-xc2vd2uo7b
    @user-xc2vd2uo7b6 ай бұрын

    Топчик 👍

  • @Bobocode

    @Bobocode

    6 ай бұрын

    Дякую! 🤩

  • @sku796
    @sku7967 ай бұрын

    Щодо стирання типів. 29:44. Тут краще пояснити наступним чином. Коли у нас є доступ до коду (через рефлексію) де оголошується конкретний тип дженерика, - тобто там, де тип T уже фіксується, і замість List у нас List - то ми можемо витягнути інформацію про тип дженерика, фактично "розпарсивши" цей клас через рефлексію. А там, де в нас намає фіксації типу - наприклад: T[] createArray() чи у виразах як-то if(x instanceof(List)), де намає доступа через рефлексію -- ми цю інформацію отримати не можемо.

  • @ArchonLicht
    @ArchonLicht7 ай бұрын

    Далеко не всі generic-и стираються. Локальні змінні - так. Але поля і параметри методів - мають в runtime інформацію про generic-и, яку можна отримати через reflection.

  • @Bobocode

    @Bobocode

    7 ай бұрын

    Підчас компіляції стираються абсолютно всі дженеріки. Якщо не вірите - подивіться байт-код. Те, про що ви кажете - це метадані. Так, інформація про те, якими були параметри типу і аргументи типу зберігається в метаданих класу і доступна через рефлексію, але сам тип в коді завжди стирається до верхньої межі. До речі, відповідні приклади з рефлексією я також показував.

  • @ArchonLicht

    @ArchonLicht

    7 ай бұрын

    @@Bobocode Метадані в даному випадку про дженеріки - про це і мова що вони залишаються. Я бачу вже ваш приклад - написав коментар подивившись першу частину. Ви трохи суперечливо пояснюєте, складається враження що вся інформація стирається повністю. Те, що на рівні байт коду є об'єкт а не якийсь конкретний тип це мало що говорить - в кінці кінців на рівні машкодів потім немає типів, а є лише пам'ять і реєстри.

  • @Bobocode

    @Bobocode

    7 ай бұрын

    @@ArchonLichtдобре, що ми розібралися ;)

  • @sku796

    @sku796

    7 ай бұрын

    Дженерики стрираються. Коли мова йде про стирання типів -- мова саме про рантайм типи. А Ви плутаеєте інформацію про *типи* *змінних* - які теоретично можна витягнути через рефлексію (але не завжди, і не найшвидшим чином ) - з реальними рантайм *типами* *даних* . В джаві маючи лише дані, ми ніяк не можемо визначити їх 'дженерик' тип -- чи то instanceof Processor, чи instanceof Processor. Коли ви говорите про поля і параметри методів -- ви переходите до рефлексії і оголошених (declared) типів -даних- контейнерів а вони можуть дуже сильно відрізнятись від рантайм типів даних, які зберігались в цих контейнерах. Крім того, ви навіть доступу до declared типу можете не мати. Наприклад, коли пишете бібліотеку, яка буде працювати з класами, які, можливо, ще взагалі ніхто не написав. Для прикладу, якщо у вас буде поле List p = new List, то інформацію про тип Circle ви ніяк не витягнете і, відповідно, не зможете зробити десь у себе new T(). максимум зарезолвите T як AbstractFigure з якою new немає сенсу робити, та й джава не дозволить. Крім того, не всі поля/методи мають в рантайм інформацію про дженерики. Приклад: void doSomething(T param) В мовах, де інформація про тип не стрирається (С#) ви можете спокійно визначити рантайм тип дженерик- змінної, навіть якщо вона прийшла до вас як Object, тобто ось таке: Boolean isStringProcessor(Object o){ return o.GetType() == typeof(List)} там буде працювати. Та й там звичайне new T() працює без усякої рефлексії.

  • @ArchonLicht

    @ArchonLicht

    7 ай бұрын

    @@sku796 Я знаю що стирається, що - ні. Ніяких «теоретично» - інформація про дженеріки у класів, в тч для приватних полів, зберігається, і може бути отримана рефлекшном. Не зберігається зовсі нічого лише для локальних змінних. Те, що в байткоді немає дженеріків, не означає що в рантаймі взагалі нічого немає. А автор спочатку говорить, що «все стирається», а потім сам же показує, що не все.

  • @BCEMCPATb
    @BCEMCPATb7 ай бұрын

    Щоб це все розуміти який рівень потрібно? Цеж не джунівський рівень чи я помиляюсь?

  • @Bobocode

    @Bobocode

    7 ай бұрын

    А з чого ви взяли, що це має бути джунівський рівень? Bobocode - це школа для досвідчених інженерів, відповідно більшість відео і завдань зроблені для досвідчених інженерів і потребують відповідного рівня.

  • @BCEMCPATb

    @BCEMCPATb

    7 ай бұрын

    @@Bobocode я просто сподіваюсь що маю знання на джун позицію а тут відео де я не доганяю і мене аж впіт кинуло. Тому і запитав. Просто знаю що ви багато пояснюєте для початківців і подумав що рівень так виріс. Дякую за відповідь, аж від сраки відлипло.))

  • @sku796

    @sku796

    7 ай бұрын

    @@BCEMCPATb Щоб так одразу доганяти, про що йде мова - з цим потрібно попрацювати і зрозуміти суть проблеми, побачити її. Щодо дженериків -- найяскравіштй приклад: спробуйте в одному класі оголосити 2 методи, які оверрайдять один одного. Один має роздруковувати список строк, інший - список людей: print(List ls){} print(List lp){}.

Келесі