es
Feedback
Java | Фишки и трюки

Java | Фишки и трюки

Ir al canal en Telegram

Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna

Mostrar más
6 954
Suscriptores
-724 horas
+117 días
+830 días
Archivo de publicaciones
🚀 Spring Boot: проект за 1 час без боли и конфигураций Spring Boot — это когда ты запускаешь продовый сервис быстрее, чем успеешь сделать себе чай. Никаких XML, минимум настроек, встроенный сервер, автоконфигурация и готовые стартовые зависимости. Вот как собрать рабочий backend за 1 час — от нуля до API. ⚙️ 1. Подключаем зависимости build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'org.postgresql:postgresql'
}
➡️ Web, валидация, JPA и PostgreSQL — базовый набор для любого сервиса. ▶️ 2. Запускаем приложение Main-класс:
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}
➡️ Встроенный Tomcat поднимется сам. Никаких конфигов, никакого сервера руками. 🌐 3. Первый REST-контроллер
@RestController
@RequestMapping("/api/hello")
public class HelloController {

    @GetMapping
    public Map<String, String> hello() {
        return Map.of("message", "Spring Boot работает!");
    }
}
➡️ Уже есть API, уже можно дёргать в Postman. 🗄 4. Настрока БД application.yml
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/demo
    username: user
    password: pass
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
➡️ Spring Boot сам создаёт таблицы, коннектится и логирует SQL. 📦 5. Сущность + репозиторий
@Entity
public class User {
    @Id @GeneratedValue
    private Long id;
    private String name;
}
public interface UserRepo extends JpaRepository<User, Long> {}
➡️ CRUD готов без единой строчки SQL. 🧩 6. Сервисный слой
@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepo repo;

    public User create(String name) {
        var user = new User();
        user.setName(name);
        return repo.save(user);
    }
}
➡️ Чистая логика, никаких репозиторных костылей в контроллере. 🎯 7. API для создания пользователя
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/users")
public class UserController {

    private final UserService service;

    @PostMapping
    public User create(@RequestParam String name) {
        return service.create(name);
    }
}
➡️ Post → сохраняем → возвращаем — 30 секунд работы. 🧪 8. Тестируем без сервера
@WebMvcTest(UserController.class)
class UserControllerTest {

    @Autowired MockMvc mvc;

    @Test
    void testCreate() throws Exception {
        mvc.perform(post("/api/users?name=Tom"))
           .andExpect(status().isOk());
    }
}
➡️ MockMvc поднимает только Web-слой, работает молниеносно. 📦 9. Создаём fat-jar и запускаем
./gradlew bootJar
java -jar build/libs/app.jar
➡️ Внутри — сервер, конфиги, код. Готово для деплоя. ☁️ 10. Dockerfile на 5 строк
FROM eclipse-temurin:21
COPY build/libs/app.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]
➡️ Легко уезжает в Kubernetes, AWS, GCP, куда хочешь. 🗣️ Запомни:Spring Boot — это не «фреймворк», а ускоритель: он убирает рутину, чтобы ты писал только логику, а не конфигурационный ад.

⌨️ Switch в Java: Забудьте про break! Помните старый switch, который мы все тихо ненавидели? Громоздкий синтаксис, необходимость писать break в каждом кейсе и страх случайно провалиться в следующий блок (fall-through). Начиная с Java 14, у нас есть Switch Expressions. Это не просто косметика, это превращение инструкции в выражение. 💀 Как было (скучно и опасно):

int days = 0;
switch (month) {
    case FEBRUARY:
        days = 28;
        break; // Забыл break? Получи баг!
    case APRIL: 
    case JUNE:
        days = 30;
        break;
    default:
        days = 31;
}
➡️ Как стало (элегантно):

int days = switch (month) {
    case FEBRUARY -> 28;
    case APRIL, JUNE -> 30;
    default -> 31;
};
Что изменилось? 1️⃣ Стрелочный синтаксис (->): Код справа от стрелки выполняется только для этого кейса. Никаких break больше не нужно! 2️⃣ Возврат значения: Теперь switch может возвращать результат, который можно сразу присвоить переменной. 3️⃣ Несколько условий: Можно перечислять кейсы через запятую (case APRIL, JUNE). 4️⃣ Слово yield: Если логика сложная и нужен многострочный блок кода, для возврата значения используется yield (вместо return).

int result = switch (input) {
    case "A" -> 1;
    case "B" -> {
        System.out.println("Вычисляем...");
        yield 2; 
    }
    default -> 0;
};
Код становится компактнее, безопаснее и понятнее.

📝 От джуна до сеньора за год? Это не про платные курсы. Потому что все эти курсы и доступ к ним лежат в Telegram Мы в TechVi
📝 От джуна до сеньора за год? Это не про платные курсы. Потому что все эти курсы и доступ к ним лежат в Telegram Мы в TechVibe не даем воздух. Мы даем: 🔴17 ТБ курсов по 89+ ЯП, и каждому направлению. 🔴Бесплатный PDF-сборник 45.000+ нейросетей под каждую задачу. 🔴Готовые шаблоны для резюме, которые проходят HR-фильтры. 🔴Советы от тимлидов, как прокачаться с джуна до сеньора. Забирайте ценное бесплатно: @techvibe

⌨️ Java Pattern Matching для instanceof: Прощай, лишний каст! Если вы пишете на Java давно, у вас наверняка выработался рефлекс: сначала проверить тип через instanceof, а потом тут же сделать явное приведение (cast). Начиная с Java 16, мы можем забыть про эту рутину. ❌ Как мы писали раньше:

Object obj = "Hello World";

if (obj instanceof String) {
    String s = (String) obj; // 🤢 Лишняя строка и дублирование типа
    System.out.println(s.toUpperCase());
}
Как писать теперь (Pattern Matching):

if (obj instanceof String s) {
    System.out.println(s.toUpperCase());
}
🧪 В чем магия? Вы объявляете переменную (s) прямо в проверке. Если obj действительно является строкой, Java автоматически приводит тип и кладет результат в s. Эта переменная доступна внутри блока if. 🚀 Уровень PRO: Вы можете использовать созданную переменную в том же условии!

if (obj instanceof String s && s.length() > 5) {
    System.out.println("Длинная строка: " + s);
}
Это мелочь, но она убирает тонны визуального шума из кода, особенно в методах equals() или при обработке разнородных данных.

Вам нравится читать контент на этом канале? Возможно, вы задумывались о том, чтобы купить на нем интеграцию? Следуйте 3 простым шагам, чтобы сделать это: 1) Нажмите на ссылку: Вход 2) Пополняйтесь удобным способом 3) Размещайте публикацию Если тематика вашего поста подойдет нашему каналу, мы с удовольствием опубликуем его.

⌨️ Java Records: Убийца бойлерплейта Устали писать бесконечные геттеры, сеттеры, equals(), hashCode() и toString() для простых классов-хранилищ данных (DTO)? Начиная с Java 14 (и как стандарт с Java 16), у нас есть Records. 💀 Как это было раньше: Чтобы создать простой класс User, нужно было написать строк 50 кода или генерировать их через IDE/Lombok. ✔️ Как это выглядит сейчас:

public record User(String name, int age) {}
Всё! Одна строка. Что происходит «под капотом»? 1️⃣ Неизменяемость: Все поля автоматически private final. 2️⃣ Конструктор: Генерируется канонический конструктор со всеми полями. 3️⃣ Методы доступа: Вместо getName(), методы называются так же, как поля — name() и age(). 4️⃣ Object методы: equals(), hashCode() и toString() уже переопределены и работают корректно. ➡️ Где использовать: Идеально подходят для DTO, ключей в Map или ответов API. 🗣️ Нюанс: Record не может наследоваться от другого класса (так как он уже неявно наследует java.lang.Record), но может имплементировать интерфейсы. А вы уже перешли на рекорды или всё еще любите @Data из Lombok? 👇

🔍Тестовое собеседование с ТехЛидом из МТС уже завтра 3 декабря(уже завтра!) в 19:00 по мск приходи онлайн на открытое собесе
🔍Тестовое собеседование с ТехЛидом из МТС уже завтра 3 декабря(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Илья Аров, старший разработчик в МТС, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Илья будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Илье Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.

☕️ JVM-тюнинг: когда GC паузы решают всё Приложение тормозит не из-за кода, а из-за GC пауз в самый неудачный момент. Garbage Collector жрёт 30% CPU, heap фрагментируется, latency скачет от 10ms до 2 секунд. Правильные флаги меняют всё: ZGC держит паузы <10ms, G1 стабилен на больших heap'ах.Мониторинг в реальном времени показывает узкие места — без этого тюнишь вслепую. ⚙️ 1. Смотрим логи GC
java -XX:+PrintGCDetails \
     -XX:+PrintGCDateStamps \
     -XX:+PrintGCTimeStamps \
     -Xloggc:gc.log \
     -jar app.jar
➡️Паузы, сборки, размеры поколений, время остановки JVM — всё видно в логах. Без этого ты тюнишь вслепую. 🚀 2. Выбираем правильный GC
# Для low-latency (микросервисы, финтех)
java -XX:+UseZGC \
     -XX:ZUncommitDelay=300 \
     -Xms8g -Xmx8g \
     -jar app.jar

# Для throughput (batch, аналитика)
java -XX:+UseG1GC \
     -XX:MaxGCPauseMillis=200 \
     -XX:InitiatingHeapOccupancyPercent=35 \
     -Xms8g -Xmx8g \
     -jar app.jar
✔️ZGC держит паузы <10ms даже на heap'е в 100GB. G1 более стабилен и предсказуем на средних объёмах. 3. Heap размер фиксированный
java -Xms8g -Xmx8g \
     -XX:+AlwaysPreTouch \
     -XX:+UseTransparentHugePages \
     -jar app.jar
➡️Xms == Xmx избегает resize пауз при росте приложения. AlwaysPreTouch выделяет память сразу, а не при первом обращении — убирает пики latency на старте. 🔧 4. Young generation отдельно
java -XX:NewRatio=3 \
     -XX:SurvivorRatio=8 \
     -XX:+UseG1GC \
     -XX:MaxGCPauseMillis=50 \
     -jar app.jar
➡️NewRatio=3 означает молодое поколение = 1/4 heap'а. SurvivorRatio=8 — eden в 8 раз больше survivor space. Частые быстрые сборки Young Gen = редкие Full GC. 💾 5. Параллельные потоки GC
java -XX:ParallelGCThreads=8 \
     -XX:ConcGCThreads=4 \
     -XX:+ParallelRefProcEnabled \
     -XX:+UseG1GC \
     -jar app.jar
➡️ParallelGCThreads — для stop-the-world сборок (обычно = кол-во ядер / 2). ConcGCThreads — параллельная работа без паузы. На 16-ядре ставь 8 и 4. ⚡️ 6. Concurrent cleanup раньше
java -XX:InitiatingHeapOccupancyPercent=35 \
     -XX:G1ReservePercent=10 \
     -XX:+UseG1GC \
     -jar app.jar
➡️GC начнёт cleanup в 35% occupancy, не дожидаясь переполнения. G1ReservePercent=10 резервирует 10% heap'а для evacuation — меньше Full GC. 🎬 7. String deduplication
java -XX:+UseG1GC \
     -XX:+UseStringDeduplication \
     -XX:StringDeduplicationAgeThreshold=3 \
     -jar app.jar
➡️Если 100k одинаковых строк в памяти (JSON, SQL, логи), G1 их объединит. AgeThreshold=3 — склеивать строки старше 3 поколений. 🌐 8. Class Data Sharing
# Создаём архив классов
java -Xshare:dump \
     -XX:SharedArchiveFile=./app-cds.jsa \
     -cp app.jar

# Боевые запуски
java -Xshare:on \
     -XX:SharedArchiveFile=./app-cds.jsa \
     -jar app.jar
➡️Классы загружаются один раз и шарятся между процессами. Startup на 30-40% быстрее, GC pressure меньше. 📈 9. Мониторим в реальном времени
# Общая картина GC
jstat -gc -h10 <pid> 1000

# Детали по поколениям
jstat -gccapacity <pid> 2000

# Причины сборок
jstat -gccause <pid> 1000
➡️Каждую секунду видишь: S0C, S1C (survivor spaces), EC (eden), OC (old), время GC. Если >5% времени в GC — пора оптимизировать. 🗣 Запомни: GC — не враг, а нервная система JVM. Настроишь — летает.

☕️ Java в коробке: когда встроенное устройство ≠ рабочий стол Java когда-то весила 500 МБ и требовала мощный железо. Теперь? GraalVM Native Image, Project Loom и TinyJVM трансформируют Java в лёгкого воина для IoT и edge. 50 МБ образ, микросекундный старт, батарея держит часы вместо минут — и это всё ещё Java. ⚡️ 1. Проблема: классическая JVM на ARM-микроконтроллере
// Классический Hello World на Raspberry Pi
java -Xmx512m -jar app.jar
// Результат: 15 секунд запуска, 300 МБ памяти, батарея мрёт
JVM для edge = убить муху кувалдой. Нужно легче. 🧠 2. GraalVM Native Image — первое спасение
native-image --no-server -H:+StaticExecutableWithDynamics -jar app.jar
./app
# Запуск: 0.05с, память: 30 МБ
➡️Статический бинарь без зависимостей. Прямо на ARM64, ARM32 — работает везде. 🔧 3. Минималистичное приложение для сенсора
public class TemperatureSensor {
    public static void main(String[] args) throws Exception {
        // Читаем температуру каждые 5 сек
        while (true) {
            double temp = readTemp(); // Из GPIO или UART
            System.out.println("Temp: " + temp + "°C");
            Thread.sleep(5000);
        }
    }
    
    static double readTemp() {
        return Math.random() * 50; // Симуляция
    }
}
➡️Всё. Никаких фреймворков, никакого overhead'а. Просто читаем и логируем. 📡 4. Связь по MQTT — стандарт IoT
import org.eclipse.paho.client.mqttv3.*;

public class IotDevice {
    public static void main(String[] args) throws Exception {
        MqttClient client = new MqttClient(
            "tcp://broker.hivemq.com:1883", 
            "device-001"
        );
        client.connect();
        
        String payload = "{\"temp\":25.5,\"humidity\":60}";
        client.publish("sensors/room1", payload.getBytes(), 1, true);
        
        client.disconnect();
    }
}
✔️Отправляем данные на MQTT-broker — и остальной мир слушает. Просто и эффективно. 🎯 5. Quarkus для edge — фреймворк, заточенный под IoT
<!-- pom.xml -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-smallrye-mqtt</artifactId>
</dependency>
mvn package -Dnative
# Результат: 80 МБ образ (вместо 500 МБ обычного Spring Boot)
➡️Quarkus + native image = полнофункциональная Java-фреймворк, который весит как Go-приложение. 🔌 6. Работа с GPIO на Raspberry Pi через Pi4j
import com.pi4j.io.gpio.*;

public class LedBlink {
    public static void main(String[] args) throws Exception {
        GpioController gpio = GpioFactory.getInstance();
        GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(
            RaspiPin.GPIO_01, 
            "LED", 
            PinState.LOW
        );
        
        for (int i = 0; i < 10; i++) {
            pin.toggle();
            Thread.sleep(500);
        }
          gpio.shutdown();
    }
}
➡️Мигаем светодиодом — классика IoT. Pi4j абстрагирует сложность GPIO'шных операций. 💾 7. Лёгкая БД для edge — SQLite или H2
import java.sql.*;

public class EdgeDb {
    public static void main(String[] args) throws Exception {
        Connection conn = DriverManager.getConnection(
            "jdbc:sqlite:/tmp/device.db"
        );
        
        Statement stmt = conn.createStatement();
        stmt.execute(
            "CREATE TABLE IF NOT EXISTS readings " +
            "(id INTEGER PRIMARY KEY, temp REAL, time LONG)"
        );
         stmt.execute(
          "INSERT INTO readings (temp, time) VALUES (25.5, " + 
           System.currentTimeMillis() + ")"
        );
         conn.close();
    }
}
➡️SQLite весит 500 КБ, не нужен отдельный сервер. Идеально для edge-узла. 🌐 8. REST API на встроенном устройстве через Micronaut
import io.micronaut.http.annotation.*;

@Controller("/api")
public class SensorController {
    
    @Get("/temperature")
    public Map<String, Object> getTemp() {
        return Map.of(
            "temp", 25.5,
            "unit", "celsius",
            "timestamp", System.currentTimeMillis()
        );
    }
}
➡️Микронаут stubs в 2-3 МБ. Запускаешь на Raspberry Pi — и уже есть REST API. 🗣️ Запомни:native image на edge = батарея в 5x дольше, код за день.

🐰 Зайтишник - это ламповый канал с забавными комиксами про айтишников и не только. 👉 Подписывайтесь - будет смешно! 👈
🐰 Зайтишник - это ламповый канал с забавными комиксами про айтишников и не только. 👉 Подписывайтесь - будет смешно! 👈

☕️ Пакеты, перегрузки и модификаторы в Java
В этом видео автор подробно разбирает, как организовывать код с помощью пакетов (packages) и зачем они нужны для структурирования проекта. Также объясняется принцип перегрузки методов — когда один метод может иметь разные версии с разными параметрами. Разбирается практическое применение модификаторов static и final, которые меняют поведение классов и методов.
👉 Ссылка на первоисточник 🗣Запомни: пакеты, перегрузки и модификаторы — это основа для написания масштабируемого и понятного кода. 🤩 Java Фишки и трюки || #Видео

⌨️ Полные и сокращённые версии AND и OR && и || называются сокращёнными логическими операторами AND и OR соответственно, или операторами короткой схемы вычислений. В спецификации Java их ещё зовут условными. Значения их операндов могут быть только булева типа. В отличие от двойных, одиночные & и | называются операторами полной схемы вычислений. Значения их операндов могут быть как только булевыми, так и только целочисленными (вместе с оператором ^ они используются в побитовых операциях). В чём разница? В том, что для операторов & и | всегда вычисляются значения обоих операндов, а при работе операторов && и || второй операнд вычисляется только по необходимости. То есть иногда результат выражения однозначно определён уже по первому операнду: ✔️ Если первый операнд && равен false, то второй не вычисляется, так как уже понятно, что результат всего выражения будет false. ✔️ Если первый операнд || равен true, то второй не вычисляется, так как уже понятно, что || вернёт true. && и || используют как операторы булевой логики. Они оперируют значениями только булева типа и применяются только в логических выражениях.

☕️ Java без JVM: магия GraalVM Native Image Когда время запуска и потребление памяти решают всё — классическая JVM становится роскошью. GraalVM превращает Java-приложение в нативный бинарь: без JVM, без warm-up, без лагов. Меньше 100 МБ памяти, запуск за миллисекунды — и это всё ещё Java. 🔥 1. Устанавливаем GraalVM

sdk install java 23-graal
gu install native-image
✔️ GraalVM — это и JVM, и компилятор в одном флаконе. native-image — его волшебная часть. ⚙️ 2. Собираем проект под GraalVM

mvn -Pnative native:compile
➡️ Плагин native-maven-plugin превращает .jar в бинарник. Никаких зависимостей на JVM при запуске. 🧩 3. Пример минимального приложения

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, native world!");
    }
}

native-image -jar app.jar
./app
✔️ Получаешь app — самостоятельный бинарь, мгновенно стартующий. 🚀 4. Время запуска и память
Java: ~1.5s, 150MB  
Native: 0.05s, 30MB
➡️ Разница ощущается не только в цифрах — контейнеры стартуют как Go или Rust-приложения. 🔍 5. Работа с Spring Boot

mvn -Pnative spring-boot:build-image
✔️ Spring Boot 3.x уже дружит с GraalVM: автоанализ конфигурации, JSON и reflection. 🧠 6. Reflection и динамика GraalVM анализирует код заранее. Всё, что создаётся рефлексией — нужно описать:

[
  { "name": "com.demo.User", "allDeclaredConstructors": true }
]
➡️ Без этого компилятор просто выкинет “лишние” классы. 🧱 7. Совместимость с Micronaut и Quarkus Эти фреймворки заточены под GraalVM:

mvn package -Dpackaging=native-image
✔️ DI, конфигурации, REST — всё работает из коробки, без плясок с reflection. 📦 8. Docker без JVM

FROM scratch
COPY app /
ENTRYPOINT ["/app"]
➡️ Никаких JDK в образе. Размер — меньше 50 МБ. Старт — мгновенный. 🧩 9. Debug и профилирование

native-image --verbose --diagnostics-mode ...
✔️ Компилятор покажет, какие классы включены, а какие выкинуты. Удобно для оптимизации. 🗣️ Запомни: GraalVM не делает Java быстрее — он делает её ближе к железу. Никаких виртуальных машин, просто чистый бинарь, который летает.

🔍 Завтра тестовое собеседование с Java-разработчиком 19 ноября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собесе
🔍 Завтра тестовое собеседование с Java-разработчиком 19 ноября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Сергею Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.

☕️ Вложенные и анонимные классы в Java
В этом видео автор подробно объясняет, что такое вложенные классы и зачем они нужны — как описать дополнительный объект, который принадлежит к основному классу. Разбирается также работа с анонимными классами, которые позволяют быстро добавить новый функционал к создаваемому объекту прямо на месте, без создания отдельного файла.
👉 Ссылка на первоисточник 🗣Запомни: вложенные и анонимные классы — инструменты для более гибкой и компактной архитектуры кода. 🤩 Java Фишки и трюки || #Видео

👨‍💻 Java + WebAssembly: когда JVM становится WASM-машиной WebAssembly давно уже не только браузер. Wasmtime дал Java прямой доступ к WASM-модулям.Пиши на Rust алгоритм, компилируй в .wasm, вызывай из Java за микросекунды.Никаких FFI, никаких JNI — просто бинарный протокол между JVM и WASM. ⚙️ 1. Устанавливаем Wasmtime
implementation("org.wasmtime:wasmtime:17.0.0")
➡️ Одна строка — и Java получает WASM-машину. 🚀 2. Загружаем и вызываем WASM-функцию
Engine engine = new Engine();
Store store = new Store(engine);
byte[] wasm = Files.readAllBytes(Paths.get("add.wasm"));
Module module = Module.fromBinary(engine, wasm);
Instance instance = new Instance(store, module, new Extern[]{});
Func add = instance.getExport(store, "add").func();
System.out.println(add.call(store, 5L, 3L));
✅ Загрузил, вызвал функцию, получил результат. 🧠 3. Компилируем Rust в WASM
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
    a + b
}
rustup target add wasm32-unknown-unknown
cargo build --target wasm32-unknown-unknown --release
➡️ Чистый бинарь ~2КБ без зависимостей. 📡 4. WASI — I/O из WASM
WasiCtx wasiCtx = WasiCtx.builder()
    .inheritStdout()
    .inheritStderr()
    .build();
wasiCtx.define(store);

Linker linker = new Linker(engine);
Instance instance = linker.instantiate(store, module);
Func main = instance.getExport(store, "_start").func();
main.call(store);
➡️ WASM-модуль получает доступ к файлам и stdout. 🔧 5. Передача памяти между JVM и WASM
Memory memory = instance.getExport(store, "memory").memory();
byte[] data = "Hello WASM".getBytes();
memory.write(store, 0, data);

Func process = instance.getExport(store, "process").func();
process.call(store, 0L, (long) data.length);

byte[] result = new byte[100];
memory.read(store, 100, result);
System.out.println(new String(result).trim());
✅ Шарим память напрямую, никаких копирований. 💾 6. Оптимизированные вычисления в WASM
#[no_mangle]
pub extern "C" fn matrix_mul(a: *const f64, b: *const f64, 
    c: *mut f64, n: usize) {
    unsafe {
        for i in 0..n {
            for j in 0..n {
                let mut sum = 0.0;
                for k in 0..n {
                    sum += (*a.add(i*n+k)) * (*b.add(k*n+j));
                }
                *c.add(i*n+j) = sum;
            }
        }
    }
}
➡️ Матричное умножение в 2-3x быстрее, чем на Java. ⚡️ 7. GraalVM Polyglot + WASM
try (Context context = Context.create("wasm")) {
    Source source = Source.newBuilder("wasm", 
        Files.readAllBytes(Paths.get("calc.wasm")), 
        "module").build();
    Value wasm = context.eval(source);
    System.out.println(wasm.getMember("add").execute(10, 20).asInt());
}
✅ Динамический вызов без явных типов. 🎬 8. Система плагинов на WASM
Map<String, Instance> plugins = new HashMap<>();

void loadPlugin(String name, String path) throws Exception {
    byte[] wasm = Files.readAllBytes(Paths.get(path));
    Instance instance = new Instance(new Store(new Engine()), 
        Module.fromBinary(new Engine(), wasm), new Extern[]{});
    plugins.put(name, instance);
}

String executePlugin(String name, String input) {
    Func process = plugins.get(name)
        .getExport(null, "process").func();
    return process.call(null, input).toString();
}
➡️ Плагины как отдельные WASM-модули, полная изоляция. 📊 9. Fibonacci: Java vs WASM
// Java: 2000ms на fib(40)
public static long fib(long n) {
    return n <= 1 ? n : fib(n-1) + fib(n-2);
}
// WASM: 380ms на fib(40)
#[no_mangle]
pub extern "C" fn fib(n: u64) -> u64 {
    match n { 0|1 => n, _ => fib(n-1) + fib(n-2) }
}
➡️ WASM выигрывает в 5 раз на рекурсии. 🗣 Запомни: WASM — не браузер, а способ запустить оптимизированный код внутри Java. Rust + WASM = скорость железа, JVM = надёжность.

Telegram опубликовал список 8 самых быстрорастущих каналов для программистов: Only Python — Подборки приёмов и фич, о которых
Telegram опубликовал список 8 самых быстрорастущих каналов для программистов: Only Python — Подборки приёмов и фич, о которых не рассказывают в курсах. Only Tech — Главные тренды и инсайды из мира технологий, маркетинга и интернет-культуры. Only Hack — Реальные кейсы кибератак, инструменты и методы защиты, которые используют хакеры. Only GitHub — Репозитории, которые решают реальные задачи. Скрипты, фреймворки и готовые решения Only IT — Без мнений и слухов — только факты и важные IT-события. Only Apple — Новые апдейты, утечки и фишки, которые Apple ещё не показала. Only GPT — Промпты, хаки и свежие инструменты, о которых молчат даже AI-каналы. Only Memes — Если ты когда-нибудь деплоил в пятницу вечером — ты поймешь Подписывайтесь и прокачивайте свои скиллы.

🧩 Java без сюрпризов: контрактное тестирование между сервисами Когда микросервисы растут, как грибы после дождя — баги начинают путешествовать между ними. Контрактное тестирование ставит границы: продюсер не ломает клиента, а потребитель не ждёт несуществующие поля. Schema-first и consumer-driven подходы делают интеграцию предсказуемой — без ручных костылей. ⚙️ 1. Schema-first — один источник истины
syntax = "proto3";

message Order {
  string id = 1;
  double amount = 2;
  string status = 3;
}
✅ Сначала схема (OpenAPI, Avro, Protobuf) — потом код. Никаких сюрпризов при интеграции. 🚀 2. Генерация классов из схемы
mvn protobuf:compile
➡️ Java-классы создаются из схемы автоматически — никто не пишет руками DTO. 🧠 3. Контракты между командами
interaction:
  request:
    method: GET
    path: /orders/123
  response:
    status: 200
    body:
      id: "123"
      amount: 50.0
✅ Фиксируешь поведение API. Если кто-то меняет ответ — тесты падают. 🧩 4. Consumer-driven contracts через Pact
@Pact(consumer = "billing-service")
public RequestResponsePact pact(PactDslWithProvider builder) {
    return builder
      .given("Order exists")
      .uponReceiving("Get order by ID")
      .path("/orders/123").method("GET")
      .willRespondWith()
      .status(200)
      .body("{\"id\":\"123\",\"amount\":50.0}")
      .toPact();
}
✅ Потребитель диктует контракт — продюсер обязан его выполнить. 🔍 5. Проверка продюсера
@Provider("order-service")
@PactFolder("pacts")
public class ProviderVerificationTest {
    @TestTemplate
    @ExtendWith(PactVerificationInvocationContextProvider.class)
    void verifyPacts(PactVerificationContext context) {
        context.verifyInteraction();
    }
}
✅ Перед деплоем проверяется, не сломали ли API. ⚙️ 6. Pact Broker — как единая база контрактов
docker run -d -p 9292:9292 pactfoundation/pact-broker
➡️ Все контракты хранятся централизованно, CI проверяет совместимость. 🧩 7. Валидация схемы при CI
mvn verify -Pcontract-tests
✅ Любая несовместимая правка схемы — стоп-релиз. 🧱 8. Миграция без боли
body:
  amount: 50.0
  currency: "USD" # новое поле, не ломает старый контракт
➡️ Добавляй поля безопасно: старые клиенты не страдают. 📦 9. Интеграция с Spring Cloud Contract
@SpringBootTest
@AutoConfigureStubRunner(ids = "com.demo:order-service:+:stubs:8080")
class BillingTest { ... }
✅ Потребитель тестируется на реальных стабах продюсера. 🗣 Запомни: контрактное тестирование — это страховка от хаоса. Код может меняться, но правила общения — нет.

В Яндексе платят 300.000р, Сбер нуждается в инженерах, а в Тинькофф нехватка кадров «Бигтех по-русски» — место, где разработч
В Яндексе платят 300.000р, Сбер нуждается в инженерах, а в Тинькофф нехватка кадров «Бигтех по-русски» — место, где разработчики из крупных компаний рассказывают правду о работе мечты, зарплатах и жизни в IT. Присоединяйся: @bigtech

⌨️ PriorityQueue — это реализация структуры данных очередь с приоритетом, которая упорядочивает элементы по их естественному порядку или по заданному компаратору. Она представляет собой часть коллекции Java Collections Framework и находится в пакете java.util. В отличие от Queue, элементы PriorityQueue не упорядочены по времени их добавления, а по приоритету. Основные методы: add(E e) - добавляет элемент в очередь. remove() - удаляет и возвращает элемент с наивысшим приоритетом. Если очередь пуста, генерируется исключение NoSuchElementException. poll() - удаляет и возвращает элемент с наивысшим приоритетом. Если очередь пуста, возвращает null. peek() - возвращает, но не удаляет элемент с наивысшим приоритетом. Если очередь пуста, возвращает null. element() - возвращает, но не удаляет элемент с наивысшим приоритетом. Если очередь пуста, генерируется исключение NoSuchElementException. Пример:

class Task implements Comparable<Task> {
    String name;
    Integer priority;

    public Task(String name, Integer priority) {
        this.name = name;
        this.priority = priority;
    }

    @Override
    public int compareTo(@NotNull Task o) {
        return priority - o.priority;
    }
}

public class Test {
    public static void main(String[] args) {
        PriorityQueue<Task> pq = new PriorityQueue<>();

        pq.add(new Task("Task1", 1));
        pq.add(new Task("Task5", 5));
        pq.add(new Task("Task2", 2));
        pq.add(new Task("Task4", 4));
        pq.add(new Task("Task3", 3));

        while (!pq.isEmpty()) {
            System.out.println(pq.poll().name);
            // Выведет: Task1, Task2, Task3, Task4, Task5
        }
    }
}
#java #PriorityQueue