Java | Фишки и трюки
前往频道在 Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna
显示更多6 953
订阅者
-324 小时
-27 天
+630 天
帖子存档
6 954
"Ты че, дурак?" – базовая реакция сеньора на тех, кто покупает IT курсы
Дело в том, что онлайн школы создают инкубаторных айтишников, которые в реальных условиях попросту зависнут.
Трушные ребята учатся на жизненных каналах для айтишников. Вот топ-5 от тимлида из Сбера:
⚙️ Технолоджия – для тех, кто хочет быть в курсе новостей в айти
🧠 Ai-чница – способы превратить нейросети в заработок $$$
💻 ИИ тебя заменит! – тенденции айти рынка в связке с нейросетями
4️⃣ Войти в IT – тонны бесплатного обучения для прогеров
😄 IT индус – сборник айти мемов
6 954
⌨️ private методы в интерфейсах
В Java с версии 9 появилась возможность использовать
private методы в интерфейсах. Эти методы предназначены для улучшения внутренней организации интерфейсов, позволяя избежать дублирования кода в default и static методах. private методы помогают реализовать общую логику, к которой могут обращаться другие методы интерфейса, но они остаются недоступными для классов, реализующих интерфейс.
private методы могут быть как экземплярными, так и static.
Пример:
public interface MyInterface {
default void showMessage() {
print("Default method calling private method");
}
static void showStaticMessage() {
print("Static method calling private method");
}
// Private method for reuse
private static void print(String message) {
System.out.println(message);
}
}
#java #interface #private6 954
Java-разработчики, у вас спрашивали про DDD на собеседовании?
А вы не знали, что ответить — кроме «ну это про бизнес-логику»?
Пора закрыть пробелы.
На практическом курсе по DDD и архитектуре микросервисов для Java-разработчиков вы:
✅ Соберёте сервис «Диспетчеризации заказов» с нуля
✅ Реализуете Aggregate, Value Object, Domain Service
✅ Освоите Clean Architecture, gRPC, Kafka, CQS
✅ Получите проект в портфолио — и уверенность в собеседованиях
👨🏫 Курс ведёт Кирилл Ветчинкин — действующий архитектор в Авито, ex-Staff Engineer в Купер, работает с 2019 года.
Всё на Java — никакого отрыва от вашей среды.
12 модулей, 6 недель практики, ревью от эксперта и живые эфиры.
Уже более 350 разработчиков прошли — теперь очередь за вами.
🔗 Записаться на курс https://microarch.ru/courses/ddd/languages/java?utm_source=posev&utm_medium=erid:2VtzqvCf2zB&utm_campaign=2
Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqvCf2zB
6 954
Stream
Все операции Stream делятся на промежуточные и терминальные и объединяются в потоковые конвейеры.
Потоковый конвейер состоит из источника (например, коллекции, массива, функции-генератора, канала ввода-вывода или генератора бесконечной последовательности) за которым следует ноль или более промежуточных операций и терминальной операции.
Промежуточные операции
📌 Промежуточные операции не выполняются до тех пор, пока не будет вызвана какая-либо терминальная операция.
Они составляют конвейер выполнения Stream. Промежуточную операцию можно добавить в конвейер Stream методами:
filter()
map()
flatMap()
distinct()
sorted()
peek()
limit()
skip()
Все промежуточные операции являются ленивыми, поэтому они не выполняются до тех пор, пока результат обработки действительно не понадобится.
По сути, промежуточные операции возвращают новый поток. Выполнение промежуточной операции фактически не выполняет никакой операции, а вместо этого создает новый поток, который при прохождении содержит элементы исходного потока, соответствующие данному предикату.
Таким образом, обход потока не начинается до тех пор, пока не будет выполнена терминальная операция конвейера.
Это очень важное свойство, особенно важное для бесконечных потоков, поскольку оно позволяет нам создавать потоки, которые будут фактически вызываться только при вызове терминальной операции.
Терминальные операции
Терминальные операции могут проходить через поток для получения результата или побочного эффекта.
📌 После выполнения терминальной операции, потоковый конвейер считается использованным и больше не может использоваться.
Терминальные операции:
forEach()
forEachOrdered()
toArray()
reduce()
collect()
min()
max()
count()
anyMatch()
allMatch()
noneMatch()
findFirst()
findAny()
Каждая из этих операций инициирует выполнение всех промежуточных операций.6 954
⌨️ Внутренняя реализация ArrayList
ArrayList — это реализация динамического массива из стандартной библиотеки коллекций java.util. Он представляет собой список, который может изменять свой размер в зависимости от количества добавляемых элементов.
ArrayList основан на массиве объектов. Это означает, что под капотом у него есть массив фиксированного размера. Когда этот массив заполняется, создается новый массив большего размера, в который копируются элементы старого массива, а затем старый массив удаляется.
Размер и емкость
✔️ Размер (size) — это количество элементов, которые фактически содержатся в ArrayList.
✔️ Емкость (capacity) — это текущий размер внутреннего массива. Когда количество элементов превышает емкость, массив расширяется.
Когда ArrayList инициализируется, его емкость по умолчанию равна 10. Если количество элементов в массиве превышает емкость, массив автоматически увеличивается. Обычно емкость увеличивается по формуле: новая емкость = старая емкость * 1.5.
Для удаления элементов используется метод remove(int index). После удаления элемента все элементы, находящиеся справа от удаленного, смещаются на одну позицию влево, что требует временных затрат O(n).
После удаления элементов ArrayList не автоматически уменьшает емкость внутреннего массива, то есть массив может занимать больше памяти, чем требуется для хранения фактических элементов. Однако для оптимизации можно вручную уменьшить емкость до текущего размера с помощью метода trimToSize().
Одним из преимуществ ArrayList является возможность доступа к элементам по индексу за время O(1). Это возможно благодаря тому, что элементы хранятся в массиве, и доступ к ним осуществляется через индекс.
#java #ArrayList6 954
🌐 REST и RESTful API
REST (Representational State Transfer) — это архитектурный стиль для проектирования сетевых приложений. Он использует стандартные методы HTTP и акцентирует внимание на взаимодействии между клиентом и сервером с помощью ресурсов.
Основные принципы REST:
1️⃣ Клиент-серверная архитектура:
- Четкое разделение между клиентом и сервером. Клиент отвечает за пользовательский интерфейс, а сервер — за обработку данных и бизнес-логику.
2️⃣ Статус и состояние:
- Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для обработки запроса. Сервер не хранит состояние сеанса (stateless).
3️⃣ Кэшируемость:
- Ответы должны быть явно обнародованы как кэшируемые или не кэшируемые. Это позволяет уменьшить количество запросов к серверу и улучшает производительность.
4️⃣ Единообразие интерфейса:
- Все взаимодействия между клиентом и сервером осуществляются через четкий и единообразный интерфейс, что упрощает интеграцию.
5️⃣ Многоуровневость:
- Система может быть структурирована на несколько уровней, где каждый уровень может вызывать другой, обеспечивая гибкость и упрощая управление.
RESTful API — это API, который следует принципам REST. Это интерфейс, который использует стандартные HTTP методы для выполнения операций с ресурсами, представленными в виде URI.
Основные HTTP методы в RESTful API:
1️⃣ GET:
- Используется для получения информации о ресурсе.
- Пример:
GET /users — получить список всех пользователей.
2️⃣ POST:
- Используется для создания нового ресурса.
- Пример: POST /users — создать нового пользователя.
3️⃣ PUT:
- Используется для обновления существующего ресурса (полное обновление).
- Пример: PUT /users/1 — обновить информацию о пользователе с ID=1.
4️⃣ PATCH:
- Используется для частичного обновления ресурса.
- Пример: PATCH /users/1 — обновить определенные поля у пользователя с ID=1.
5️⃣ DELETE:
- Используется для удаления ресурса.
- Пример: DELETE /users/1 — удалить пользователя с ID=1.
RESTful API обычно возвращают данные в форматах:
- JSON (JavaScript Object Notation): легковесный формат, который легко читаем и записывается как людьми, так и машинами. Это самый распространенный формат для передачи данных в RESTful API.
- XML (eXtensible Markup Language): более старый формат, который также используется, но менее популярен в новых приложениях.
Применение RESTful API:
✔️ Веб-приложения: RESTful API часто используются в веб-приложениях для взаимодействия с серверами и базами данных.
✔️ Мобильные приложения: Многие мобильные приложения используют RESTful API для получения данных.
✔️ Интеграция систем: RESTful API позволяют различным системам взаимодействовать друг с другом с минимальными усилиями.
#REST #RESTfulAPI #API6 954
📝 От чайника до эксперта за полгода? Это не про платные курсы.
🧐 Потому что наш главный секрет — не магическая таблетка, а правильная структура обучения
Мы в IT Matrix не даем воздух, мы даем:
➡️ Бесплатный PDF-сборник 45.000+ нейросетей под каждую задачу [получить]
➡️ 17 ТБ курсов по 89+ ЯП, и каждому направлению
➡️ Готовые шаблоны для резюме, которые проходят HR-фильтры [забрать]
Каждый день - новая порция полезного контента
Приму только 20 желающих, успей : https://t.me/+DekXiNRP6C4yODQy
6 954
☕️ Java в 2025 году: стоит ли учить и что изменилось
В этом видео автор анализирует, насколько Java остаётся актуальной в 2025 году и какие изменения произошли в языке и экосистеме. Разбираются ключевые области применения Java — от корпоративных систем и Android-разработки до backend-сервисов — и сравнивается её востребованность с другими языками программирования.👉 Ссылка на первоисточник 🗣️Запомни: Java не теряет позиции — она просто становится инструментом для тех, кто хочет стабильности и глубины в IT. 🤩 Java Фишки и трюки || #Видео
6 954
🔍Тестовое собеседование с ТехЛидом из МТС уже завтра
5 ноября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Илья Аров, старший разработчик в МТС, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Илья будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Илье
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
6 954
⌨️ Для чего используется оператор assert?
Assert (Утверждение) — это специальная конструкция, позволяющая проверять предположения о значениях произвольных данных в произвольном месте программы. Утверждение может автоматически сигнализировать об обнаружении некорректных данных, что обычно приводит к аварийному завершению программы с указанием места обнаружения некорректных данных.
Утверждения существенно упрощают локализацию ошибок в коде. Даже проверка результатов выполнения очевидного кода может оказаться полезной при последующем рефакторинге, после которого код может стать не настолько очевидным и в него может закрасться ошибка.
Обычно утверждения оставляют включенными во время разработки и тестирования программ, но отключают в релиз-версиях программ.
Так как утверждения могут быть удалены на этапе компиляции либо во время исполнения программы, они не должны менять поведение программы. Если в результате удаления утверждения поведение программы может измениться, то это явный признак неправильного использования
assert. Таким образом, внутри assert нельзя вызывать методы, изменяющие состояние программы, либо внешнего окружения программы.
В Java проверка утверждений реализована с помощью оператора assert, который имеет форму:
assert [Выражение типа boolean]; или assert [Выражение типа boolean] : [Выражение любого типа, кроме void];
Во время выполнения программы в том случае, если поверка утверждений включена, вычисляется значение булевского выражения, и если его результат false, то генерируется исключение java.lang.AssertionError. В случае использования второй формы оператора assert выражение после двоеточия задаёт детальное сообщение о произошедшей ошибке (вычисленное выражение будет преобразовано в строку и передано конструктору AssertionError).6 954
🔬 Java под микроскопом: полный observability-стек с OpenTelemetry
Когда прод «горит», а метрики молчат — ты не DevOps, ты шаман.
OpenTelemetry превращает хаос в прозрачность: метрики, трейсы, логи — всё в единой системе.
Ни теории, ни лекций — только практика, как сделать observability-стек, который реально работает.
🔥 1. Подключаем OpenTelemetry SDK
implementation("io.opentelemetry:opentelemetry-api:1.31.0")
implementation("io.opentelemetry:opentelemetry-sdk:1.31.0")
implementation("io.opentelemetry:opentelemetry-exporter-otlp:1.31.0")
➡️ Эти три зависимости — ядро: API, SDK и экспорт в OTLP (универсальный протокол).
⚙️ 2. Инициализация провайдера трейсинга
SdkTracerProvider tracerProvider = SdkTracerProvider.builder()
.addSpanProcessor(BatchSpanProcessor.builder(OtlpGrpcSpanExporter.builder().build()).build())
.build();
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(tracerProvider)
.build();
✅ Настраиваешь, кто будет собирать и куда шлёт трейсы.
🧩 3. Создаём спаны прямо в коде
Tracer tracer = openTelemetry.getTracer("com.trading.app");
try (Scope scope = tracer.spanBuilder("DB Query").startScopedSpan()) {
db.execute("SELECT * FROM orders");
}
➡️ Каждый участок кода можно измерить и потом визуализировать в Grafana Tempo или Jaeger.
📊 4. Метрики: CPU, latency, GC — всё под контролем
Meter meter = openTelemetry.getMeter("com.trading.metrics");
LongCounter reqCount = meter.counterBuilder("http.requests.total").build();
reqCount.add(1, Attributes.of(stringKey("endpoint"), "/api/trade"));
✅ Теперь ты знаешь, сколько, откуда и как часто — без лишнего логирования.
📈 5. Интеграция с Prometheus
OtlpGrpcMetricExporter exporter = OtlpGrpcMetricExporter.builder()
.setEndpoint("http://localhost:4317")
.build();
➡️ Метрики попадают в Prometheus, а дальше — Grafana dashboards.
🪵 6. Логирование в едином формате
logger.info("order_created", kv("user", userId), kv("amount", amount));
✅ Через OpenTelemetry Logs SDK ты получаешь корреляцию между логами и трейсами.
🌐 7. Автоинструментирование без кода
java -javaagent:opentelemetry-javaagent.jar \
-Dotel.service.name=order-service \
-Dotel.exporter.otlp.endpoint=http://localhost:4317 \
-jar app.jar
➡️ Автоматически собираются спаны из Spring, JDBC, Kafka, Redis и HTTP-клиентов.
🧠 8. Отправка данных в локальный Collector
receivers:
otlp:
protocols:
grpc:
http:
exporters:
prometheus:
logging:
jaeger:
endpoint: "localhost:14250"
service:
pipelines:
traces: { receivers: [otlp], exporters: [jaeger, logging] }
metrics: { receivers: [otlp], exporters: [prometheus] }
✅ OpenTelemetry Collector — сердце стека: маршрутизирует всё.
🚀 9. Связка Jaeger + Prometheus + Loki
Traces → Jaeger Metrics → Prometheus Logs → Loki➡️ Полная наблюдаемость: один ID связывает всё — от HTTP-запроса до GC-паузы. 🧩 10. Добавляем контекст трассировки в логи
MDC.put("traceId", Span.current().getSpanContext().getTraceId());
logger.info("processing order {}", orderId);
✅ Теперь по traceId можно прыгнуть из Loki прямо в Jaeger.
🕹 11. Настройка дашбордов в Grafana
➡️ CPU / Memory / GC Time ➡️ Request latency per endpoint ➡️ Top error spans per service ➡️ Logs correlated by traceId✅ Всё видно, всё связано, всё в одном UI. 🧠 12. Distributed tracing на проде
try (Scope scope = tracer.spanBuilder("match_order").startScopedSpan()) {
orderService.match(order);
}
➡️ С каждой операцией передаётся trace-контекст по HTTP-заголовкам — видишь цепочку от frontend до БД.
🗣️ Запомни: Observability — это не «чтобы было красиво», а чтобы не гадать в тьме, где у тебя течёт прод.6 954
Команда Яндекса — это профессионалы, которые одержимы своим делом и решают задачи, где нет готовых решений.
Сейчас мы ищем сильных бэкенд-разработчиков — с опытом от 3 лет на C++, Python, Java или Go. Участвуйте в Week Offer, чтобы получить офер онлайн, всего за неделю.
Как будет проходить Week Offer Backend?
• Подайте заявку до 12 ноября.
• Пройдите технические секции 15 и 16 ноября.
• Познакомьтесь с командами и получите офер 17–21 ноября.
Если вам интересно строить полезные сервисы вокруг ИИ-технологий, проводить исследования и превращать их в реальные продукты для миллионов пользователей — переходите по ссылке. На сайте собрали все подробности.
6 954
💸 Java + Финансы: low-latency трейдинг под миллисекунды
Когда миллисекунды — это деньги, Java раскрывает себя на максимум: низкоуровневые сокеты, реактивные потоки, pinned GC и прямой доступ к памяти. Тут не про «финтех-приложение», а про «реакцию быстрее всех».
🚀 1. TCP-сокеты для прямого подключения к бирже
Socket socket = new Socket("api.exchange.com", 4001);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("SUBSCRIBE:BTC-USD");
System.out.println("Tick: " + in.readLine());
➡️ Без HTTP, без JSON — только байты и скорость.
⚡️ 2. NIO (Reactor-стиль) — обрабатываем десятки потоков данных без блокировок
Selector selector = Selector.open();
SocketChannel channel = SocketChannel.open(new InetSocketAddress("api.exchange.com", 8080));
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
while (true) {
selector.select();
for (SelectionKey key : selector.selectedKeys())
((SocketChannel) key.channel()).read(ByteBuffer.allocate(1024));
}
✅ Ты читаешь данные в event-loop без ожиданий и блокировок.
💹 3. Лёгкий REST-клиент для котировок — минимальный overhead
HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
HttpRequest req = HttpRequest.newBuilder(URI.create("https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT")).build();
String body = client.send(req, HttpResponse.BodyHandlers.ofString()).body();
System.out.println(body);
➡️ Используется редко — только для инициализации данных.
🧩 4. Реактивные потоки — стриминг обновлений без лагов
Flux.interval(Duration.ofMillis(10))
.flatMap(i -> fetchTick())
.subscribe(System.out::println);
✅ Поддерживаешь live-данные с минимальной задержкой.
⚙️ 5. Kafka для внутренней шины котировок
ProducerRecord<String, String> tick = new ProducerRecord<>("ticks", "BTC", json);
producer.send(tick);
➡️ Kafka — идеальный посредник между стратегией и обработчиком сигналов.
📈 6. Резервный кеш в LMAX Disruptor
Disruptor<Event> disruptor = new Disruptor<>(Event::new, 1024, Executors.defaultThreadFactory());
disruptor.handleEventsWith((event, seq, end) -> process(event));
disruptor.start();
✅ Микросекундные задержки между событиями — идеально для high-freq.
🧠 7. Обработка стратегий — минимальный GC и аллокации
double pnl = 0.0;
for (int i = 0; i < prices.length; i++)
pnl += (prices[i] - avg) * weights[i];
➡️ Никаких boxed-типов, никаких потоков — чистая арифметика.
🕹 8. Async запись в базу через Chronicle Queue
ChronicleQueue queue = ChronicleQueue.single("trades");
ExcerptAppender appender = queue.acquireAppender();
appender.writeText("BUY BTC 1.234 @ 67900");
✅ Без JDBC, без GC, с записью прямо в память.
📡 9. Ping-тест задержки на уровне API
long t1 = System.nanoTime();
client.send(request, HttpResponse.BodyHandlers.discarding());
System.out.println("Latency: " + (System.nanoTime() - t1) / 1_000_000.0 + " ms");
➡️ Измеряй свои реальные RTT-времена, а не верь документации.
🔒 10. Failover на другом потоке без паузы
CompletableFuture.supplyAsync(() -> fetch("exchangeA"))
.exceptionally(e -> fetch("exchangeB"))
.thenAccept(this::trade);
✅ Если один источник умер — переходишь мгновенно на другой.
📊 11. Garbage-free JSON парсер для потоков данных
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(stream);
while (parser.nextToken() != JsonToken.END_OBJECT)
process(parser.getCurrentName(), parser.getValueAsString());
➡️ Никаких String, никаких List — только поток и числа.
⏱️ 12. Синхронизация времени с NTP
NtpV3Packet msg = new NtpV3Impl();
msg.setMode(3);
System.out.println("Offset: " + client.getTime(InetAddress.getByName("pool.ntp.org")).getOffset());
✅ В high-freq даже миллисекундный дрейф — это баг.
🗣️ Запомни: в мире Java-трейдинга твой главный конкурент — не другой разработчик, а время Garbage Collector’а.6 954
29 октября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью по System Design.
Как это будет:
📂 Дмитрий Дорофеев, TeamLead в американском FitTech Truv Inc, ex-VK, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Дмитрий будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Дмитрию
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
6 954
🤖 JavaBot: Telegram без магии и фреймворков
Хочешь быстро поднять Telegram-бота на Java без плясок вокруг Spring? Берём библиотеку TelegramBots, одну точку входа — и поехали.
⚙️ Подключаем зависимость
Gradle:
implementation 'org.telegram:telegrambots:6.9.7'
🧩 Создаём скелет бота
public class EchoBot extends TelegramLongPollingBot {
public String getBotUsername() { return "MyJavaBot"; }
public String getBotToken() { return "TOKEN"; }
public void onUpdateReceived(Update u) {
var chat = u.getMessage().getChatId().toString();
var text = u.getMessage().getText();
send(chat, "Ты написал: " + text);
}
void send(String chatId, String msg) {
try { execute(new SendMessage(chatId, msg)); }
catch (Exception e) { e.printStackTrace(); }
}
}
🚀 Запускаем бота
var bots = new TelegramBotsApi(DefaultBotSession.class);
bots.registerBot(new EchoBot());
System.out.println("Бот в деле 🚀");
💬 Тест
Ты: ping Бот: Ты написал: ping🧠 Добавим немного логики
if (text.equals("/start"))
send(chat, "Привет! Я Java-бот 💪");
else if (text.equalsIgnoreCase("время"))
send(chat, LocalTime.now().toString());
else
send(chat, "Команда не понята 🤖");
⚡️ Inline-кнопки
var markup = new InlineKeyboardMarkup();
markup.setKeyboard(List.of(List.of(
new InlineKeyboardButton("Сказать hi").callbackData("hi")
)));
msg.setReplyMarkup(markup);
🧱 Структура проекта
src/ ├── Main.java └── EchoBot.java build.gradle🗣 Запомни: в Java всё строго — но именно поэтому Telegram-боты тут живут годами, не падают и не висят в “reconnecting…”
6 954
👩💻 В сеть вывалилась гигантская куча курсов и книг от топовых IT‑школ
Держи сотни гигабайт свежих уроков, и каждую неделю мы подкидываем ещё!
• 1612 ГБ — DevOps
• 1402 ГБ — Python
• 1300 ГБ — C, C++
• 1815 ГБ — Frontend
• 1515 ГБ — Backend
• 898 ГБ — ИБ, Хакинг
• 996 ГБ — Kotlin, Swift
• 212 ГБ — JavaScript
• 315 ГБ — Flutter
• 820 ГБ — Go, PHP
• 419 ГБ — Java, Rust
• 648 ГБ — GameDev
• 517 ГБ — Windows, Linux
• 998 ГБ — Дизайн (UX/UI)
• 617 ГБ — Нейросети (ML/RL)
• 546 ГБ — БД (SQL & NoSQL)
• 687 ГБ — Аналитика данных
• 115 ГБ — QA-тестирование
Подписывайся и не плати за то, что можно получить бесплатно
6 954
⌨️ Виды классов
1. Обычные классы (Regular Classes)
Это наиболее распространенные классы, которые вы создаете для определения объектов. Они могут содержать поля, методы, конструкторы и вложенные классы.
public class MyClass {
private int field;
public MyClass(int field) {
this.field = field;
}
public void method() {
// some code
}
}
2. Абстрактные классы (Abstract Classes)
Абстрактные классы не могут быть созданы как объекты напрямую. Они предназначены для предоставления общей функциональности, которую подклассы должны реализовать или дополнить.
public abstract class AbstractClass {
public abstract void abstractMethod();
public void concreteMethod() {
// some code
}
}
3. Вложенные классы (Nested Classes)
Классы, объявленные внутри другого класса. Они могут быть статическими или нестатическими.
🔹 Статические вложенные классы (Static Nested Classes):
Эти классы могут быть созданы без экземпляра внешнего класса.
public class OuterClass {
static class StaticNestedClass {
// some code
}
}
🔹 Внутренние классы (Inner Classes):
Эти классы имеют доступ ко всем членам внешнего класса и создаются в контексте экземпляра внешнего класса.
public class OuterClass {
class InnerClass {
// some code
}
}
4. Локальные классы (Local Classes)
Классы, объявленные внутри метода, конструктора или блока. Они имеют доступ к финальным переменным из охватывающего метода.
public class OuterClass {
public void method() {
class LocalClass {
// some code
}
LocalClass local = new LocalClass();
}
}
5. Анонимные классы (Anonymous Classes)
Классы без имени, создаваемые на месте для реализации интерфейса или наследования от класса. Часто используются для создания экземпляров интерфейсов или абстрактных классов.
public class OuterClass {
public void method() {
Runnable runnable = new Runnable() {
@Override
public void run() {
// some code
}
};
}
}
6. Перечисления (Enums)
Специальные классы, представляющие набор констант. Они могут содержать поля, методы и конструкторы.
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
7. Интерфейсы (Interfaces)
Технически не классы, но важная часть объектно-ориентированного программирования в Java. Интерфейсы определяют контракты, которые должны быть реализованы классами.
public interface MyInterface {
void myMethod();
}
8. Записи (Records)
Нововведение в Java 14 (в предварительном виде) и официально в Java 16. Они предоставляют компактный способ создания неизменяемых классов с полями и автоматически сгенерированными методами, такими как equals, hashCode и toString.
public record Point(int x, int y) {}
#java #classes6 954
☕️ Java в потоке данных: Flink, Beam и Spark без магии
Когда данные бегут нескончаемым потоком, а твой монолит не успевает считать, Java превращается в машину для real-time-аналитики.
Flink, Beam и Spark — три пути к масштабным потоковым системам. Ни теории — только код.
💀 Обычный подход — всё тормозит
List<String> lines = Files.readAllLines(Paths.get("data.txt"));
Map<String, Long> counts = lines.stream()
.flatMap(line -> Arrays.stream(line.split(" ")))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(counts);
➡️ Всё в память, всё синхронно. Умер на первом гигабайте.
⚙️ Flink — потоковые вычисления без задержек
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> stream = env.socketTextStream("localhost", 9999);
stream
.flatMap((String line, Collector<String> out) -> {
for (String word : line.split(" ")) out.collect(word);
})
.keyBy(word -> word)
.sum(1)
.print();
env.execute("Flink WordCount");
✅ Реактивная обработка, fault tolerance и state — всё из коробки.
🧩 Spark Structured Streaming — SQL на лету
SparkSession spark = SparkSession.builder().appName("StreamSQL").getOrCreate();
Dataset<Row> lines = spark.readStream()
.format("socket")
.option("host", "localhost")
.option("port", 9999)
.load();
Dataset<Row> words = lines.as(Encoders.STRING())
.flatMap((FlatMapFunction<String, String>) x -> Arrays.asList(x.split(" ")).iterator(), Encoders.STRING());
words.groupBy("value").count()
.writeStream()
.outputMode("complete")
.format("console")
.start()
.awaitTermination();
✅ DataFrame API + реальное время. SQL-запросы к стримам — это норма.
🧠 Beam — пиши один раз, запускай где угодно
Pipeline p = Pipeline.create();
p.apply(TextIO.read().from("input.txt"))
.apply(ParDo.of(new DoFn<String, String>() {
@ProcessElement
public void processElement(ProcessContext c) {
for (String word : c.element().split(" ")) c.output(word);
}
}))
.apply(Count.perElement())
.apply(TextIO.write().to("output"));
p.run().waitUntilFinish();
✅ Beam абстрагирует всё: один pipeline может жить на Flink, Spark, Dataflow — без правок кода.
🚀 Kafka + Flink = real-time пайплайн
FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("logs", new SimpleStringSchema(), props);
env.addSource(consumer)
.map(line -> line.toUpperCase())
.addSink(new FlinkKafkaProducer<>("processed", new SimpleStringSchema(), props));
✅ Поток заходит из Kafka, проходит трансформацию и возвращается обратно.
📊 Stateful обработка
stream.keyBy(value -> value)
.flatMap(new RichFlatMapFunction<String, Tuple2<String, Integer>>() {
private transient ValueState<Integer> count;
public void open(Configuration parameters) {
count = getRuntimeContext().getState(new ValueStateDescriptor<>("count", Integer.class));
}
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
Integer current = count.value() == null ? 0 : count.value();
count.update(current + 1);
out.collect(Tuple2.of(value, current + 1));
}
});
✅ Flink хранит состояние между событиями — perfect для realtime аналитики.
🧩 Beam с Cloud Dataflow
PipelineOptions options = PipelineOptionsFactory.create();
options.as(DataflowPipelineOptions.class).setRunner(DataflowRunner.class);
✅ Запускаешь тот же код в Google Cloud — нативно масштабируется.
💡 Spark + Kafka integration
Dataset<Row> df = spark.readStream()
.format("kafka")
.option("kafka.bootstrap.servers", "localhost:9092")
.option("subscribe", "topic")
.load();
✅ Spark сам читает Kafka topics и обрабатывает потоки.
🗣 Запомни: Flink — мозг real-time систем, Spark — мотор аналитики, Beam — мост между ними. Главное — не выбирай фреймворк по моде, выбирай под поток.6 954
❗️ Произошёл масштабный слив Apple, Open AI, Microsoft и других западных гигантов
В сеть утекли корпоративные документы для обучения персонала: гайды, инструкции к ИИ, инсайды по грядущим новинкам и разработкам.
Целых 4 терабайта (!) инфы распределили по закрытым каналам. Сохраняй пока доступно:
❖ Гайды по ИИ и инструментам для работы и творчества
❖ Чеклисты, фреймворки, репозитории и куча полезностей
❖ Инсайды по IT-разработкам и новым технологиям
❖ Слитая инфраструктура Apple
❖ Обучения легальному и нелегальному хаккингу
❖ Всё про Python от топов из Microsoft
❖ + бонус: канал с мемами про IT, ИИ и технологии.
👆 Подпишись, скоро поменяем ссылки
6 954
☕️Полиморфизм в ООП
В этом видео автор подробно объясняет концепцию полиморфизма в объектно-ориентированном программировании на примере Java. Разбирается, как один объект может иметь разные формы в зависимости от контекста, как работает динамическое связывание, как переопределять методы в наследниках и использовать ссылки на родительские типы для управления объектами.🗣️Запомни: полиморфизм даёт гибкость в архитектуре и делает код расширяемым и масштабируемым. 🤩 Java Фишки и трюки || #Видео
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
