Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
public class Main {
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
synchronized (lock1) {
try { Thread.sleep(100); } catch (Exception e) {}
synchronized (lock2) {
System.out.println("Thread 1");
}
}
});
Thread t2 = new Thread(() -> {
synchronized (lock2) {
try { Thread.sleep(100); } catch (Exception e) {}
synchronized (lock1) {
System.out.println("Thread 2");
}
}
});
t1.start();
t2.start();
try {
t1.join(500);
t2.join(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main finished");
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
Collectors.partitioningBy() — это коллектор из Java Stream API, который разделяет элементы потока на две группы (true/false) на основе заданного предиката, возвращая Map<Boolean, List<T>>.
import java.util.*;
import java.util.stream.*;
import java.util.function.Predicate;
public class PartitioningByExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Разделение чисел на четные и нечетные
Map<Boolean, List<Integer>> partitioned = numbers.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
System.out.println("Четные: " + partitioned.get(true)); // [2, 4, 6, 8, 10]
System.out.println("Нечетные: " + partitioned.get(false)); // [1, 3, 5, 7, 9]
// Строки по длине
List<String> words = Arrays.asList("яблоко", "груша", "слива", "апельсин", "лимон");
Map<Boolean, List<String>> byLength = words.stream()
.collect(Collectors.partitioningBy(word -> word.length() > 5));
System.out.println("\nКороткие слова (≤5 букв): " + byLength.get(false));
System.out.println("Длинные слова (>5 букв): " + byLength.get(true));
// С дополнительным коллектором - подсчет количества
Map<Boolean, Long> countPartition = numbers.stream()
.collect(Collectors.partitioningBy(
n -> n > 5,
Collectors.counting()
));
System.out.println("\nЧисел ≤5: " + countPartition.get(false));
System.out.println("Чисел >5: " + countPartition.get(true));
}
}
👀 Особенно полезен для разделения данных на прошедшие/не прошедшие валидацию, категоризации на успешные/ошибочные операции, статистического анализа.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
90% айтишников проваливают рост в тимлиды ещё до старта
Они читают книжки, смотрят курсы — а потом ломаются на первом конфликте с командой или бизнесом
В канале Артём Харченков | IT Инсайты:
— Разборы реальных ситуаций из жизни тимлида
— Как выглядят правильные решения глазами тимлида
— Чем отличается сильный айтишник от тимлида
Подписывайся, если хочешь понимать, как устроено тимлидство изнутри: @teamlead_insights
Они читают книжки, смотрят курсы — а потом ломаются на первом конфликте с командой или бизнесом
В канале Артём Харченков | IT Инсайты:
— Разборы реальных ситуаций из жизни тимлида
— Как выглядят правильные решения глазами тимлида
— Чем отличается сильный айтишник от тимлида
Подписывайся, если хочешь понимать, как устроено тимлидство изнутри: @teamlead_insights
🔥1
Доступ к ChatGPT за 5 минут без VPN с помощью Cloudflare
Короткая, но годная статья по реализации программы, которая позволяет запускать ChatGPT без VPN. Статья вышла буквально 2 дня назад, потому еще долго будет сохранять свою актуальность, юзайте!
⛓ Читать статью
➡️ Easy Java | #Статья
Короткая, но годная статья по реализации программы, которая позволяет запускать ChatGPT без VPN. Статья вышла буквально 2 дня назад, потому еще долго будет сохранять свою актуальность, юзайте!
Please open Telegram to view this post
VIEW IN TELEGRAM
Хороший айтишник ≠ хороший руководитель
И это причина, почему большинство застревают в своем развитии.
📊 Управление — это отдельный навык.
В канале Апазиди АйТи показывают, как его развить в реальном IT.
▪️ управленческие ошибки, которые тихо ломают карьеру
▪️ почему созвоны — признак слабой системы
▪️ как строить команды без постоянного контроля
Читай тут: 👉 https://t.me/+Jcx__bY56BwwN2Uy
И это причина, почему большинство застревают в своем развитии.
В канале Апазиди АйТи показывают, как его развить в реальном IT.
Читай тут: 👉 https://t.me/+Jcx__bY56BwwN2Uy
Please open Telegram to view this post
VIEW IN TELEGRAM
В данной статье автор разобрал основные подходы к работе с REST API в Java и поделился популярными библиотеками для реализации retry-механизмов.
Каждый из подходов имеет свои преимущества и недостатки, а выбор подходящего решения зависит от конкретных требований проекта.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13❤2
Math.multiplyExact() — это метод из класса java.lang.Math, который выполняет умножение двух чисел с проверкой на переполнение. При переполнении выбрасывается исключение ArithmeticException.
public class MultiplyExactExample {
public static void main(String[] args) {
// Безопасное умножение int
int a = 1000000;
int b = 2000;
try {
int result1 = Math.multiplyExact(a, b);
System.out.println(a + " * " + b + " = " + result1);
} catch (ArithmeticException e) {
System.out.println("Переполнение int: " + e.getMessage());
}
// Переполнение на примере
int maxInt = Integer.MAX_VALUE;
try {
int dangerous = Math.multiplyExact(maxInt, 2);
} catch (ArithmeticException e) {
System.out.println("Ожидаемое переполнение: " + maxInt + " * 2");
}
// Работа с long
long big1 = 10_000_000_000L;
long big2 = 5_000L;
try {
long result2 = Math.multiplyExact(big1, big2);
System.out.println(big1 + " * " + big2 + " = " + result2);
} catch (ArithmeticException e) {
System.out.println("Переполнение long: " + e.getMessage());
}
// Практический пример: вычисление факториала с проверкой
System.out.println("\nВычисление факториала с проверкой переполнения:");
for (int i = 1; i <= 20; i++) {
try {
long factorial = computeFactorial(i);
System.out.println(i + "! = " + factorial);
} catch (ArithmeticException e) {
System.out.println(i + "! - переполнение!");
break;
}
}
}
private static long computeFactorial(int n) {
long result = 1;
for (int i = 2; i <= n; i++) {
result = Math.multiplyExact(result, i);
}
return result;
}
}
Особенно полез при научных и финансовых вычислениях, откладки математических алгоритмов, криптографических операциях.
Please open Telegram to view this post
VIEW IN TELEGRAM
import java.lang.annotation.*;
import java.lang.reflect.Method;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation {
String value() default "";
}
class Processor {
@MyAnnotation("first")
public void method1() {}
@MyAnnotation("second")
private void method2() {}
@MyAnnotation("third")
protected void method3() {}
public void method4() {}
}
public class Main {
public static void main(String[] args) throws Exception {
Class<?> clazz = Processor.class;
int count = 0;
for (Method method : clazz.getDeclaredMethods()) {
if (method.isAnnotationPresent(MyAnnotation.class)) {
count++;
// Делаем приватный метод доступным
method.setAccessible(true);
}
}
System.out.println("Annotated methods: " + count);
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
Anonymous Quiz
21%
Annotated methods: 1
17%
Annotated methods: 2
46%
Annotated methods: 3
16%
Annotated methods: 4
В статье объясняют, как вместо проверки конкретных данных тестировать их свойства, зачем это нужно, как помогает Jqwik для Java и где пригодится на практике.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
TutorialsPoint — это онлайн-ресурс, который предоставляет широкий спектр учебных материалов и учебных пособий, включая учебные пособия по различным языкам программирования, включая Java.
— Структуры данных: Обучение включает в себя работу с массивами, списками и другими структурами данных.
— Объектно-ориентированное программирование (ООП): Вы изучите концепции ООП, такие как классы, объекты, наследование, полиморфизм и инкапсуляция.
— Потоки ввода/вывода: Вы научитесь более глубоко разбираться с потоками для ввода и вывода данных.
— Java API: Рассмотрение стандартной библиотеки классов Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁14❤3🤣2
Optional.orElseThrow() — это метод класса Optional<T>, который возвращает значение, если оно присутствует, или выбрасывает исключение, если значение отсутствует. Добавлен в Java 10 как альтернатива get() с явным указанием исключения.
import java.util.*;
import java.util.function.Supplier;
public class OrElseThrowExample {
public static void main(String[] args) {
// Пример с пользователями
Optional<User> user = findUserById(123);
try {
// Получение значения с дефолтным исключением
User foundUser = user.orElseThrow();
System.out.println("Найден пользователь: " + foundUser.name());
} catch (NoSuchElementException e) {
System.out.println("Пользователь не найден (дефолтное исключение)");
}
// С кастомным исключением
Optional<User> emptyUser = findUserById(999);
try {
User user2 = emptyUser.orElseThrow(
() -> new UserNotFoundException("Пользователь с ID 999 не существует")
);
} catch (UserNotFoundException e) {
System.out.println("Поймано кастомное исключение: " + e.getMessage());
}
// Практический пример: валидация конфигурации
Config config = loadConfig()
.orElseThrow(() -> new IllegalStateException("Конфигурация не загружена"));
System.out.println("Конфигурация загружена: " + config);
// Цепочка вызовов с обработкой ошибок
String result = findUserById(123)
.map(User::email)
.orElseThrow(() -> new RuntimeException("Email не найден"));
System.out.println("Email пользователя: " + result);
}
static Optional<User> findUserById(int id) {
// Имитация поиска в базе данных
if (id == 123) {
return Optional.of(new User(123, "Иван Иванов", "ivan@example.com"));
}
return Optional.empty();
}
static Optional<Config> loadConfig() {
// Имитация загрузки конфигурации
return Optional.of(new Config("production"));
}
record User(int id, String name, String email) {}
record Config(String environment) {}
static class UserNotFoundException extends Exception {
public UserNotFoundException(String message) {
super(message);
}
}
}
Особенно полезен при валидации прааметров, обработки отсутствующих значений в цепочках вызовов, замене проверов if, преобразовании optional в исключения в контроллерах/сервисах.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
def counter_decorator(func):
count = 0
def wrapper(*args, **kwargs):
nonlocal count
count += 1
result = func(*args, **kwargs)
print(f"Call {count}: {result}")
return result
return wrapper
@counter_decorator
def multiply(a, b):
return a * b
multiply(2, 3)
multiply(4, 5)
multiply(6, 7)
Please open Telegram to view this post
VIEW IN TELEGRAM
🤡19💩7🤣5🤔1
В сборнике вопросы от самых базовых, до самых продвинутых среди «джуновских» вопросов. Сразу можно посмотреть ответ, что очень удобно.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9🥰2🤡2
BufferedReader.lines() — это метод, который возвращает Stream<String> строк, прочитанных из BufferedReader. Каждый элемент потока — это одна строка из файла или другого источника.
import java.io.*;
import java.nio.file.*;
import java.util.stream.*;
public class BufferedReaderLinesExample {
public static void main(String[] args) {
String filePath = "example.txt";
// Создаем тестовый файл
createTestFile(filePath);
// Чтение файла с использованием lines()
try (BufferedReader reader = Files.newBufferedReader(Paths.get(filePath))) {
// Простое чтение всех строк
System.out.println("Все строки файла:");
reader.lines()
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
// Сложная обработка с Stream API
try (BufferedReader reader = Files.newBufferedReader(Paths.get(filePath))) {
System.out.println("\nАнализ файла:");
long lineCount = reader.lines().count();
System.out.println("Всего строк: " + lineCount);
} catch (IOException e) {
e.printStackTrace();
}
// Фильтрация и преобразование
try (BufferedReader reader = Files.newBufferedReader(Paths.get(filePath))) {
System.out.println("\nСтроки содержащие 'Java':");
reader.lines()
.filter(line -> line.contains("Java"))
.map(String::toUpperCase)
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
// Параллельная обработка большого файла
try (BufferedReader reader = Files.newBufferedReader(Paths.get(filePath))) {
long wordCount = reader.lines()
.parallel() // Включаем параллельную обработку
.flatMap(line -> Arrays.stream(line.split("\\s+")))
.filter(word -> !word.isEmpty())
.count();
System.out.println("\nВсего слов в файле: " + wordCount);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void createTestFile(String path) {
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(path))) {
writer.write("Java - популярный язык программирования\n");
writer.write("Stream API появился в Java 8\n");
writer.write("BufferedReader предоставляет удобные методы\n");
writer.write("lines() возвращает Stream строк\n");
writer.write("Это полезно для обработки больших файлов\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Особенно полезен для обработки больших лог-файлов, парсинге CSV, анализе текстовых данных, чтении конфигурационных файлов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1