Java for Beginner
743 subscribers
708 photos
196 videos
12 files
1.14K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Введение в GraphQL


GraphQL — это язык запросов для приложения, который позволяет клиентам (например, мобильным приложениям или веб-сайтам) запрашивать ровно те данные, которые им нужны, без лишнего. Он был создан компанией Facebook в 2012 году и стал открытым стандартом в 2015. В отличие от традиционных подходов, где сервер диктует, какие данные отдавать, здесь клиент сам формирует запрос. Это делает систему гибкой и эффективной.


Почему GraphQL вместо привычных методов?

Представь, что у тебя есть интернет-магазин. В старом подходе, называемом REST (это аббревиатура от "Representational State Transfer", что значит "передача состояния представления" — способ организации API, где каждый запрос идёт по фиксированному адресу), ты бы создал отдельные точки входа: одну для списка товаров, другую для деталей пользователя, третью для отзывов. Клиент запрашивает всё сразу, даже если ему нужно только имя товара и цена — и получает кучу лишних данных. Это тратит трафик и замедляет приложение.

GraphQL решает это одной точкой входа (обычно /graphql). Клиент пишет запрос на языке, похожем на JSON, указывая, какие поля нужны. Сервер возвращает только их.

Плюсы:
Меньше запросов: Можно получить данные из нескольких источников за один раз.
Типизация: Всё строго описано в схеме (это как каркас данных, где указано, какие типы полей и как они связаны).
Версионирование не нужно: Клиенты сами выбирают, что запрашивать, без изменений в API.
Интроспекция: Клиент может "спросить" сервер о доступных данных.


В экосистеме Java GraphQL интегрируется легко, особенно с Spring Boot — это фреймворк для быстрой разработки приложений на Java, который упрощает настройку серверов. Есть библиотека graphql-java, но для Spring лучше использовать spring-graphql — она берёт на себя интеграцию.


Настройка проекта: Шаги для старта

Давай создадим простой проект. Предполагаем, у тебя есть Java 17+ и Maven (система сборки проектов). Если новичок, скачай Spring Initializr с сайта spring.io — это онлайн-генератор проектов.

Создай проект Spring Boot с зависимостями:
Spring Web (для HTTP-сервера).
Spring GraphQL (для поддержки GraphQL).
Spring Data JPA (если нужно база данных, для хранения данных).
H2 Database (встроенная база для тестов).


В файле pom.xml (это конфигурация Maven) добавь:
xml<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-graphql</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>


Определи схему. Схема — это файл с описанием типов данных.

Создай файл schema.graphqls в resources/graphql:
graphqltype Query {
bookById(id: ID): Book
allBooks: [Book]
}

type Book {
id: ID
title: String
author: Author
}

type Author {
id: ID
name: String
books: [Book]
}
Здесь Query — это корневой тип для запросов. ID — уникальный идентификатор, String — текст. [Book] значит список книг. Это позволяет запрашивать книги с авторами, и сервер сам свяжет данные.


Создай модель данных. В Java это классы с аннотациями (метками для фреймворка).

Для книги:
javaimport jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;

@Entity
public class Book {
@Id
private Long id;
private String title;
@ManyToOne
private Author author;

// Геттеры и сеттеры (методы для чтения и записи полей)
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public Author getAuthor() { return author; }
public void setAuthor(Author author) { this.author = author; }
}



#Java #middle #on_request #GraphQL
🔥3👍1
Репозитории для доступа к данным. Spring Data упрощает это:
javaimport org.springframework.data.jpa.repository.JpaRepository;

public interface BookRepository extends JpaRepository<Book, Long> {
}
Это интерфейс, который автоматически генерирует методы вроде findById.



Резолверы: Где происходит магия

Резолверы — это методы, которые "разрешают" запросы, то есть вычисляют данные.

В Spring создай класс:
javaimport graphql.kickstart.tools.GraphQLQueryResolver;
import org.springframework.beans.factory.annotation.Autowired;

public class QueryResolver implements GraphQLQueryResolver {
@Autowired
private BookRepository bookRepository;

public Book bookById(Long id) {
return bookRepository.findById(id).orElse(null); // Возвращает книгу или null, если не найдена
}

public List<Book> allBooks() {
return bookRepository.findAll(); // Все книги
}
}
@Autowired — это инъекция зависимости, Spring сам подставит репозиторий. Для автора аналогично создай AuthorResolver для поля books.


Чтобы связать автора с книгами, добавь резолвер для типа Book:
javaimport graphql.kickstart.tools.GraphQLResolver;

public class BookResolver implements GraphQLResolver<Book> {
public Author author(Book book) {
return book.getAuthor(); // Просто возвращает автора из модели
}
}
Это позволяет в запросе GraphQL получить автора без дополнительных усилий.



Запуск и тестирование

В основном классе приложения (обычно с @SpringBootApplication) ничего менять не нужно — Spring сам настроит /graphql.

Запусти приложение:
mvn spring-boot:run.


Теперь протестируй в инструменте вроде GraphiQL (встроен в Spring GraphQL, доступен по /graphiql).

Пример запроса:
graphqlquery {
bookById(id: 1) {
title
author {
name
}
}
}


Сервер вернёт:
json{
"data": {
"bookById": {
"title": "Война и мир",
"author": {
"name": "Лев Толстой"
}
}
}
}


Только то, что запрошено! Если нужно мутации (изменения данных), добавь type Mutation в схему и резолверы для createBook и т.д.


Продвинутые советы для опытных

Обработка ошибок: Используй GraphQLError для кастомных сообщений.
Производительность: Добавь DataLoader для batch-запросов, чтобы избежать N+1 проблемы (когда для списка из N элементов делается N запросов в базу).
Безопасность: Включи аутентификацию с Spring Security, ограничи поля по ролям.
Интеграция с другими сервисами: GraphQL может агрегировать данные из микросервисов.



Пример с DataLoader для оптимизации:

Сначала добавь зависимость graphql-java-tools.

Затем в конфигурации:
@Bean
public DataLoaderRegistry dataLoaderRegistry(BookRepository bookRepo) {
DataLoaderRegistry registry = new DataLoaderRegistry();
registry.register("authorLoader", DataLoader.newDataLoader((List<Long> authorIds) ->
CompletableFuture.supplyAsync(() -> bookRepo.findAuthorsByIds(authorIds)))); // Batch-запрос
return registry;
}


В резолвере используй контекст для загрузки.
Это делает систему масштабируемой.


#Java #middle #on_request #GraphQL
🔥3👍1
Предлагаем темы для разбора и публикации! 📖

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

Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.

Примерные правила:
🟢 темы, не выше уровня middle, чтоб был интерес общим.
🟢Один человек - одна тема.
🟢Тема должна быть отдельным теоретически-практическим вопросом. Готовый проект - это не тема!

Активнее народ! Неужто ничего не интересно?

Жду Ваших предложений! 👏
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Выбираем темы для рассмотрения в следующие выходные! 🤨
Anonymous Poll
35%
AOP
46%
Введение в gRPC
19%
Введение в Camunda
👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🗓 История IT-технологий сегодня — 28 сентября


ℹ️ Кто родился в этот день

Се́ймур Роджер Крэй (также Крей) (англ. Seymour Roger Cray; 28 сентября 1925, Чиппева-Фолс[англ.], Висконсин, США — 5 октября 1996, Колорадо-Спрингс, США)американский инженер в области вычислительной техники, создатель ряда американских суперкомпьютеров. Славу изобретателю принесли компьютеры CDC 6600, Cray-1 и Cray-2, которые в течение ряда лет были самыми мощными в мире.


🌐 Знаковые события

1999 релиз игры Homeworld.

2009 — индийским космическим аппаратом Chandrayaan-1 на Луне обнаружена вода.


#Biography #Birth_Date #Events #28Сентября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Всем привет!

По традиции, сел писать мотивационную статью на воскресение, но пока думал над темой - решил написать статью - размышление (часто что-то размышлять стал ☺️).

А поразмышлять я предлагаю о нашем будущем (ну отдельно Вашем и моем), как программистов.

Проведя много опросов, я понимаю, что подписчики канала в основном делятся на 2 категории:
1. Основная - мечтатели, которые хотят вкатиться в IT.
2. Менее представленная - уже работающие джуны и мидлы (в т.ч. и в иных профессиях IT), которые ищут способы дальнейшего развития (как и я).


Как я сейчас вижу ситуацию с рынком труда.

На мой неискушенный взгляд - все сложно и плохо. Побродив по отзывам и собесам, понимаю - время джунов прошло. Знания Java Core сейчас вообще недостаточно для поиска работы. Иначе говоря вчерашние мидлы - сейчас практически джуны и с них начинается минимальный поиск работника.

Что с этим делать я не знаю. Наверно только как завещал дедушка Ленин - учится и учится.

Можно конечно пойти "волчьим" путем, начиная от задрачивания собесов до подделки документов об опыте работы. Но для меня лично, это вообще не вариант. Уже сейчас HR-ы активно ищут и находят противодействие этому и думаю через пару лет эта практика будет умирать (наверно).

Что делать нам, тем кто находится в начале/начале+ профессионального пути?

Вопрос в том, что каждый из нас хочет развиваться. Расти как в профессиональном плане, так и в финансовом. (Цены быстро растут, а грейд нет😆)

А проблемами является то, что снизу подпирают вчерашние вкатуны с нарисованным опытом, готовые и обещающие выполнять твои обязанности быстрее и дешевле (и не важно что это лажа, тебя же уже попросят), так и то что сверху, из-за стагнации рынка, остаются те же сеньоры и мидлы+ которые никуда не уходят, не освобождая ниш для нас.

Что в этой ситуации делать?

Я не знаю.

Но для себя вижу такой план:
1. Развитие, развитие и только постоянное развитие. Куда и как, вопрос отдельный.
2. Наведение связей в IT-шной среде, знакомство с как можно большим количеством разработчиков.
3. Постоянный мониторинг рынка, чтобы понимать, насколько и как все меняется.

Разберу подробнее.

1. Развитие.

Без него никуда.
Не знаете Кафку - вы никому уже не интересны.
Не знаете зачем кубер или как настроить docker-compose, с вами не о чем поговорить в профессиональном плане.
Не понимаете чем SAGA отличается от MVC - с вами просто не будут говорить.

И это только вершина айсберга.

2. Коммуникация.

Мы социальные существа. Программисты конечно менее, но все же.

Вчерашний джун, случайно, по знакомству устроившийся в топ-компанию и протащивший Вас по реферальной программе - вот реальный кейс о котором сейчас говорят HR.
Обмен интересным опытом, фраймворками, бест практикс и код флоу на проектах - вы практически не найдете этого на Ютубе.
И да, в том же телеграмме уже много подобных каналов/чатов, но найти теплый и приветливый очень сложно (чем выше грейд - тем выше чсв).

3. Мониторинг.

Наверно самая простая и понятная часть плана. Кто осведомлен - тот вооружен.
И если завтра погонят палками - хотя-бы будешь понимать чего ждать от рынка 😄.


В итоге, каким я вижу свое будущее

Однозначно светлым (может даже нефильтрованным ✈️)

А если серьезно, то компетенции и знакомства - ключ к развитию во всех планах.
И этот канал, для меня, как раз один из способов этого достичь.

Как собственно и для Вас.

Хотя бесконечно жаль, что 90% подписчиков это даже не прочитают 🤬

Да не, не жаль 😄😏

Ведь мы сами творцы своего счастья и если кто-то жаждет развития, он его найдет так и так.
А тем кто ждет, что ему все принесут на блюдечке с серебряной каёмочкой - я могу лишь пожелать удачи 👏.


А остальным я предлагаю кооперироваться. Не сидеть каждому в своей раковине, а настраивать мосты общения, обмена опытом и идеями, совместной командной разработки. 🤝


А что Вы думаете об этом???


На этом извольте откланяться - ваш @Oleborn

😎
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2
🗓 История IT-технологий сегодня — 29 сентября


ℹ️ Кто родился в этот день

Александр Георгиевич Шамов (29 сентября 1951, Петропавловск, Северо-Казахстанская область, Казахская ССР, СССР — 7 ноября 2020, Казань, Республика Татарстан, Российская Федерация) — советский/российский физик-химик и информатик; вёл прикладные исследования с использованием ЭВМ, руководил подразделениями по информатизации в казанских научных и учебных учреждениях, лауреат республиканской премии.

Сергей Игоревич Маторин (29 сентября 1954 года в Москве) — доктор технических наук, профессор, заведующий кафедрой прикладной информатики; разработал методы моделирования, системного анализа и инженерии знаний, применявшиеся в информационно-аналитических системах.

Oscar H. Ibarra (родился 29 сентября 1941 года в Негросе Оксидентал , Филиппины) — филиппино-американский теоретик информатики; известен работами по теории автоматов, формальным языкам и сложности, профессор UCSB — важная фигура в теоретической информатике.

Маркус Хендрик «Марк» Овермарс ( голландское произношение: [ˈmɑrkʏs ˈɦɛndrɪk ˈmɑr(ə)k ˈoːvərmɑrs] ; родился 29 сентября 1958 года) — нидерландский учёный в вычислительной геометрии и практик (создатель GameMaker); внёс вклад в алгоритмы для графики, робототехники и инструментальные средства для разработки игр.


🌐 Знаковые события

1951 — открыт 12-й спутник Юпитера — Ананке.


#Biography #Birth_Date #Events #29Сентября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Коллекции в Java

Глава 1. Введение в коллекции

Обзор Java Collections Framework. Интерфейсы Collection и Map. Иерархия коллекций. Отличия коллекций от массивов

Java Collections Framework (JCF) — это набор интерфейсов, классов и алгоритмов в пакете java.util, предназначенный для работы с коллекциями данных. JCF предоставляет унифицированный способ хранения и манипуляции объектами, делая код более гибким и эффективным.

- Компоненты JCF:
- Интерфейсы: Определяют контракт (что можно делать с коллекцией).
- Реализации: Конкретные классы, реализующие интерфейсы (например, ArrayList для List).
- Алгоритмы: Встроенные методы для сортировки, поиска и т.д. (в классе Collections).


JCF введен в Java 1.2 и значительно улучшен в Java 5 с generics (обобщениями), которые обеспечивают типобезопасность.

- Преимущества JCF:
- Гибкость: Динамический размер, в отличие от массивов.
- Типобезопасность: С generics — компилятор проверяет типы.
- Эффективность: Разные реализации для разных сценариев (быстрый доступ, уникальность элементов и т.д.).
- Полиморфизм: Работа через интерфейсы, легко менять реализации.



Интерфейсы Collection и Map

JCF построен вокруг двух основных интерфейсов: Collection для последовательностей объектов и Map для пар ключ-значение.

1. Интерфейс Collection<E>:
- Это базовый интерфейс для коллекций, где E — тип элементов (generics).
- Представляет группу объектов, позволяя добавлять, удалять, перебирать.
- Не гарантирует порядок или уникальность — зависит от реализации.


- Основные методы:
- add(E e): Добавляет элемент.
- remove(Object o): Удаляет элемент.
- size(): Возвращает размер.
- isEmpty(): Проверяет пустоту.
- iterator(): Для перебора (Iterator).
- contains(Object o): Проверяет наличие.


- Нюанс: Collection не индексирован (нет get(int index)), для этого — подинтерфейсы как List.

2. Интерфейс Map<K, V>:
- Представляет отображение: пары ключ-значение, где K — тип ключа, V — тип значения.
- Ключи уникальны, значения могут дублироваться.
- Не является подтипом Collection (Map не коллекция элементов, а ассоциация).


- Основные методы:
- put(K key, V value): Добавляет/обновляет пару.
- get(Object key): Возвращает значение по ключу.
- remove(Object key): Удаляет по ключу.
- size(), isEmpty().
- keySet(): Коллекция ключей (Set<K>).
- values(): Коллекция значений (Collection<V>).
- entrySet(): Коллекция пар (Set<Map.Entry<K, V>>).


- Нюанс: Map не упорядочен (кроме SortedMap), ключи не null (в большинстве реализаций).


#Java #для_новичков #beginner #Collections #Map
👍3
Иерархия коллекций в JCF

JCF имеет иерархию интерфейсов и реализаций. Вот подробная структура:

1. Иерархия Collection:

- Collection<E> (базовый):
- List<E>: Упорядоченная коллекция, позволяет дубликаты, индексация.
- Реализации: ArrayList (быстрый доступ), LinkedList (быстрые вставки/удаления), Vector (устаревший, synchronized).
- Set<E>: Неупорядоченная коллекция уникальных элементов.
- Реализации: HashSet (быстрый поиск), TreeSet (отсортированный), LinkedHashSet (сохраняет порядок вставки).
- Queue<E>: Для очередей (FIFO), или приоритетных.
- Реализации: LinkedList (как Queue), PriorityQueue (приоритетная), ArrayDeque (deque).
- Deque<E>: Двусторонняя очередь (добавление/удаление с обоих концов).
- Реализации: ArrayDeque, LinkedList.


2. Иерархия Map:

- Map<K, V> (базовый):
- HashMap<K, V>: Быстрый поиск по хэшу, не упорядочен.
- TreeMap<K, V>: Отсортированный по ключам (SortedMap).
- LinkedHashMap<K, V>: Сохраняет порядок вставки.
- Hashtable<K, V>: Устаревший, synchronized.


- Generics: С Java 5: Collection<String> list = new ArrayList<>(); — типобезопасно.

- Нюансы иерархии:
- Все реализации — concrete классы, кроме абстрактных helper-классов (AbstractList).
- Synchronized: Для многопоточности используйте Collections.synchronized*() или Concurrent* классы (ConcurrentHashMap).
- Performance: Выбирайте по нуждам — HashSet O(1) поиск, TreeSet O(log n) с сортировкой.
- Immutability: Collections.unmodifiable*() для read-only коллекций.



Отличия коллекций от массивов

Массивы — базовый тип в Java для хранения элементов фиксированного размера. Коллекции — более гибкий инструмент из JCF.

- Подробное сравнение:
1. Размер:
- Массивы: Фиксированный (int[] arr = new int[10]; — нельзя изменить).
- Коллекции: Динамический (ArrayList.add() расширяет автоматически).


2. Типы элементов:
- Массивы: Могут хранить примитивы (int[]) или объекты.
- Коллекции: Только объекты (Collection<Integer> для примитивов через wrapper).


3. Методы:
- Массивы: Ограничены (длина .length, доступ по индексу).
- Коллекции: Богатый API (add, remove, contains, sort, iterator).


4. Generics:
- Массивы: Нет (Object[] может хранить всё, но без проверки).
- Коллекции: С generics — типобезопасно (компилятор проверяет).


5. Performance:
- Массивы: Быстрее для фиксированного размера и примитивов.
- Коллекции: Overhead, но удобнее; ArrayList близок к массиву.


6. Многомерность:
- Массивы: Легко (int[][]).
- Коллекции: Вложенные (List<List<Integer>>).


7. Null и дубликаты:
- Оба позволяют, но Set в коллекциях запрещает дубликаты.

Пример перехода от массива к коллекции:

Массив:
String[] names = new String[3];
names[0] = "Алексей";
// Нет add, нужно вручную управлять размером


Коллекция:
List<String> names = new ArrayList<>();
names.add("Алексей"); // Динамично
names.remove(0); // Легко удалить

- Нюанс: Коллекции используют массивы внутри (ArrayList — resizable array).


Как работать с JCF в IntelliJ IDEA

1. Импорт: Импортируйте java.util.* или конкретно (IDE подскажет Ctrl+Space).
2. Generics: Напишите List<String> — IDE проверит типы.
3. Коллекции: New → Collection → Выберите реализацию.
4. Методы: Автодополнение для add, remove и т.д.
5. Debug: В отладке смотрите содержимое коллекций.



Полезные советы для новичков

- Выбирайте интерфейс: Кодьте под List, а не ArrayList — легко сменить реализацию.
- Generics всегда: Избегайте raw types (List без <E> — устарело).
- Коллекции vs массивы: Массивы для фиксированных примитивов, коллекции для всего остального.
- Performance: ArrayList для доступа, LinkedList для вставок, HashSet для уникальности.



#Java #для_новичков #beginner #Collections #Map
👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
😱1
Что выведет код?

public class Task290925 {
public static void main(String[] args) {
Boolean a = true;
Boolean b = true;
Boolean c = new Boolean(true);

System.out.println((a == b) + " " + (a == c));
}
}


#Tasks
🗿2
Варианты ответа:
Anonymous Quiz
62%
true true
29%
true false
3%
false true
6%
false false
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓

Голосуем за тему к рассмотрению в эти выходные!

Выбираем новую тему!

(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)

Не стесняемся! ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопрос с собеседований

Что такое JIT-компилятор?🤓

Ответ:

JIT (Just-In-Time)
— это часть JVM, которая во время выполнения переводит часто используемый байт-код в машинный код для ускорения работы.

Это позволяет сочетать переносимость байт-кода и скорость нативных программ.

JVM оптимизирует только «горячие» участки кода.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3