Java | Фишки и трюки
7.21K subscribers
182 photos
29 videos
6 files
40 links
Java: примеры кода, интересные фишки и полезные трюки

Купить рекламу: https://telega.in/c/java_tips_and_tricks

✍️По всем вопросам: @Pascal4eg
Download Telegram
Что выведет код?
Anonymous Quiz
14%
<ничего>
11%
2468
57%
4
18%
2
👍5🎉3
⌨️ Классы-обёртки (wrapper classes)

В Java классы-обёртки (wrapper classes) используются для того, чтобы представлять примитивные типы данных как объекты. Это необходимо, так как Java — это объектно-ориентированный язык, и в некоторых случаях, например, при работе с коллекциями, нужно использовать объекты вместо примитивных типов. Для каждого примитивного типа данных существует соответствующий класс-обёртка.

Java автоматически преобразует примитивные типы в соответствующие объекты классов-обёрток и наоборот. Это упрощает код, так как программисту не нужно делать это вручную.

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

Некоторые классы-обёртки, такие как Byte, Short, Integer и Long, кэшируют значения в определённом диапазоне (от -128 до 127), что улучшает производительность при частом использовании этих значений.

#java #wrappers
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍7
⌨️ "Распрямление" потока. Метод flatMap

Метод Stream.flatMap используется для преобразования элементов одного потока (stream) в несколько элементов другого потока, а затем объединения этих элементов в один поток. Это особенно полезно, когда у вас есть коллекция коллекций, и вы хотите "распрямить" её, т.е. получить плоскую структуру, содержащую все элементы.

Допустим, у вас есть список строк, каждая из которых содержит несколько слов, и вы хотите получить поток всех слов:

List<String> sentences = Arrays.asList("Java is fun", "I love programming");

Stream<String> wordsStream = sentences.stream()
.flatMap(sentence -> Arrays.stream(sentence.split(" "))); // Преобразуем в поток слов

wordsStream.forEach(System.out::println);


Результат:

Java
is
fun
I
love
programming


Здесь каждый массив слов был преобразован в поток, а затем flatMap "распрямил" эти потоки в один.

#java #stream #flatMap
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
⌨️ Чем отличаются методы Stream.toList() и Stream.collect(Collectors.toList())?

Методы Stream.toList() и Stream.collect(Collectors.toList()) кажутся схожими, так как оба возвращают список, но есть ключевое отличие: Stream.toList() возвращает неизменяемый список, а Stream.collect(Collectors.toList()) возвращает изменяемый список на базе ArrayList.

#java #stream #toList
Please open Telegram to view this post
VIEW IN TELEGRAM
👍203
⌨️ Чем различаются Thread и Runnable?

Thread - это класс, некоторая надстройка над физическим потоком.

Runnable - это интерфейс, представляющий абстракцию над выполняемой задачей.

Интерфейс Runnable позволяет логически отделить логику выполнения задачи от непосредственного управления потоком.

#java #Thread #Runnable
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62
⌨️ Интерфейс CharSequence

Интерфейс CharSequence представляет собой последовательность символов и является базовым интерфейсом для работы с различными строковыми типами. Он был введён в Java начиная с версии 1.4 и служит для предоставления общего интерфейса для объектов, которые могут быть представлены как последовательность символов.

CharSequence реализован такими классами, как:
String — неизменяемая строка.
StringBuilder — изменяемая последовательность символов.
StringBuffer — изменяемая, но потокобезопасная последовательность символов.

CharSequence определяет несколько методов, которые предоставляют доступ к символам последовательности и информации о ней:

int length();

Возвращает количество символов в последовательности.


char charAt(int index);

Возвращает символ по указанному индексу.


CharSequence subSequence(int start, int end);

Возвращает новую последовательность символов, которая является подстрокой оригинальной последовательности. Индекс start включается, а end — нет.


String toString();

Возвращает строковое представление последовательности символов.


CharSequence cs = "Hello, World!";
System.out.println("Length: " + cs.length());
System.out.println("Char at index 1: " + cs.charAt(1));
System.out.println("Subsequence (0, 5): " + cs.subSequence(0, 5));
System.out.println("String: " + cs.toString());


Вывод:

Length: 13
Char at index 1: e
Subsequence (0, 5): Hello
String: Hello, World!


#java #CharSequence
Please open Telegram to view this post
VIEW IN TELEGRAM
8🥰1
public class Quest {
public static void main(String[] args) {
int i = Integer.MAX_VALUE;
i++;
if (i == 0) {
System.out.println("ZERO");
} else if (i == Integer.MIN_VALUE) {
System.out.println("MIN");
}
}
}

#java #quest
2
🔥71🤔1🎉1
⌨️ Пропуск элементов потока. Метод skip

Потоки данных поддерживают метод skip(n), возвращающий поток данных с отброшенными первыми n элементами источника. Если в потоке-источнике было меньше n элементов, возвращается пустой поток.

Например, следующий код пропускает первые два блюда, содержащие более 300 калорий, и возвращает остальные:

List<Dish> dishes = menu
.stream()
.filter(d -> d.getCalories() > 300)
.skip(2)
.collect(toList());


#java #stream #skip
Please open Telegram to view this post
VIEW IN TELEGRAM
👏73
⌨️ Вчера вышла Java 23

Внутри много интересного, например Markdown документация, поддержка примитивных типов в паттернах и операторах instanceof / switch и многое другое.

Появился еще один тип классов - неявный, как будто существующих нам было мало 😁

Теперь приложение может стартовать даже если метод main не статический и не содержит параметр String[] args:

// --enable-preview --source 23
class HelloWorld {
void main() {
System.out.println("Hello, World!");
}
}

В таком случае во время запуска JVM сама создаст экземпляр класса HelloWorld и вызовет у него метод main():

$ java --enable-preview --source 23 HelloWorld.java
Hello, World!


И даже вот так!:

// HelloWorld.java

String greeting = "Hello, World!";

void main() {
println(greeting);
}

То есть вообще не объявляя класса! В таком случае виртуальная машина сама объявит неявный класс, в который поместит метод main() и другие верхнеуровневые объявления в файле. Фишка здесь еще и в том что используется метод println() вместо System.out.println(), это возможно из-за того что в неявный класс по умолчанию импортируется новый класс java.io.IO, в котором есть соответствующий метод.

Подробнее можно почитать на Habr'е.

#java23
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍14😢84
💎 Проблема ромба (Diamond problem)

Ромбовидное наследование (diamond inheritance) — ситуация в объектно-ориентированных языках программирования с поддержкой множественного наследования, когда два класса B и C наследуют от A, а класс D наследует от обоих классов B и C. При этой схеме наследования может возникнуть неоднозначность: если объект класса D вызывает метод, определенный в классе A (и этот метод не был переопределен в классе D), а классы B и C по-своему переопределили этот метод, то от какого класса его наследовать: B или C?

В Java множественное наследование не разрешено для классов и разрешено только для интерфейсов, чтобы устранить эту серьезную проблему.

#java #diamond #problem
Please open Telegram to view this post
VIEW IN TELEGRAM
5🥰1
public class Quest {
public static final int END = Integer.MAX_VALUE;
public static final int START = END - 100;

public static void main(String[] args) {
int count = 0;
for (int i = START; i <= END; i++) count++;
System.out.println(count);
}
}

#java #quest
5
⌨️ Метод Stream.anyMatch

Метод anyMatch служит для ответа на вопрос: «Удовлетворяет ли заданному предикату хотя бы один элемент из потока данных?»

Метод anyMatch возвращает boolean, а значит, является завершающей (терминальной) операцией.


int[] digits = {1, 3, 5, 7, 2, 9};
boolean result = Arrays.stream(digits).anyMatch(d -> d % 2 == 0);
System.out.println(result); // true


#java #Stream #anyMatch
Please open Telegram to view this post
VIEW IN TELEGRAM
14
⌨️ Методы allMatch и noneMatch интерфейса Stream

Метод allMatch проверяет, удовлетворяют ли заданному предикату все элементы потока данных.


// Все не чётные?
int[] digits = {1, 3, 5, 7, 9};
boolean result = Arrays.stream(digits).allMatch(d -> d % 2 != 0);
System.out.println(result); // true


Противоположностью allMatch является метод noneMatch. Он проверяет, точно ли ни один элемент списка не соответствует заданному предикату.

// Нет чётных?
int[] digits = {1, 3, 5, 7, 9};
boolean result = Arrays.stream(digits).noneMatch(d -> d % 2 == 0);
System.out.println(result); // true


#java #Stream #allMatch #noneMatch
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
public class Quest {
public static void main(String[] args) {
int minutes = 0;
for (int ms = 0; ms < 60 * 60 * 1000; ms++) {
if (ms % 60 * 1000 == 0) {
minutes++;
}
}
System.out.println(minutes);
}
}

#java #quest
1💘1
Что выведет код?
Anonymous Quiz
50%
60
31%
60000
19%
3600000
🥱11👍3👏2🎉1
⌨️ Какие побитовые операции вы знаете?

~ Побитовый унарный оператор NOT;

& Побитовый AND;

&= Побитовый AND с присваиванием;

| Побитовый OR;

|= Побитовый OR с присваиванием;

^ Побитовый исключающее XOR;

^= Побитовый исключающее XOR с присваиванием;

>> Сдвиг вправо (деление на 2 в степени сдвига);

>>= Сдвиг вправо с присваиванием;

>>> Сдвиг вправо без учёта знака;

>>>= Сдвиг вправо без учёта знака с присваиванием;

<< Сдвиг влево (умножение на 2 в степени сдвига);

<<= Сдвиг влево с присваиванием.

#java #bitwise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1