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

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

✍️По всем вопросам: @Pascal4eg
Download Telegram
😢25😁15🤣6👨‍💻2🤪21🌚1💊1
⌨️ Внутренняя реализация StringBuilder

Класс StringBuilder предназначен для создания и манипуляции изменяемыми строками. Это альтернативный класс для String, который позволяет изменять его содержимое без создания новых объектов при каждой операции изменения, что делает его более эффективным при частых операциях изменения строк.

Класс StringBuilder использует массив символов для хранения строки и динамически изменяет его размер по мере необходимости. Переменная count отслеживает текущую длину строки.
Упрощенно:

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
char[] value; // Массив символов, хранящий содержимое строки
int count; // Количество символов в текущем объекте StringBuilder
}


Примерная реализация метода append:

public StringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
ensureCapacityInternal(count + len); // расширить массив если нужно
str.getChars(0, len, value, count);
count += len;
return this;
}


Метод str.getChars(..) копирует строку str в массив value в позицию count (то есть добавляет в конец массива).

#java #stringbuilder #implementation
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥31👨‍💻1
⌨️ Полезные стримы. Группировка

Дан список людей с именем и городом проживания. Нужно сгруппировать их по городам.

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

record Person(String name, String city) {}

public class StreamExample {
public static void main(String[] args) {
List<Person> people = List.of(
new Person("Alice", "New York"),
new Person("Bob", "Los Angeles"),
new Person("Charlie", "New York"),
new Person("David", "Los Angeles"),
new Person("Edward", "San Francisco")
);

Map<String, List<Person>> peopleByCity = people.stream()
.collect(Collectors.groupingBy(Person::city));

peopleByCity.forEach((city, peopleInCity) -> {
System.out.println(city + ": " + peopleInCity.stream()
.map(Person::name)
.collect(Collectors.joining(", ")));
});
// Вывод:
// San Francisco: Edward
// New York: Alice, Charlie
// Los Angeles: Bob, David
}
}


#java #stream #grouping
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥4👏21
⌨️ Какое исключение выбрасывается при возникновении ошибки в блоке инициализации класса?

Если возникшее исключение - наследник RuntimeException:

- для статических блоков инициализации будет выброшено java.lang.ExceptionInInitializerError;

- для нестатических будет проброшено исключение-источник.

Если возникшее исключение - наследник Error, то в обоих случаях будет выброшено java.lang.Error. Исключение: java.lang.ThreadDeath - смерть потока. В этом случае никакое исключение выброшено не будет.

#java #initialization #exception
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2👏1
class Dog {
public static void bark() {
System.out.print("Woof ");
}
}

class Basenji extends Dog {
public static void bark() { }
}

public class Bark {
public static void main(String[] args) {
Dog woofer = new Dog();
Dog nipper = new Basenji();
woofer.bark();
nipper.bark();
}
}


#java #quest
🔥71👍1
Что выведет код?
Anonymous Quiz
44%
Woof Woof
46%
Woof
10%
<ничего>
😁7🔥2❤‍🔥1🎉1🤣1
⌨️ Как получить доступ к переопределенным методам родительского класса?

С помощью ключевого слова super мы можем обратиться к любому члену родительского класса - методу или полю, если они не определены с модификатором private.


super.method();


#java #override #super
Please open Telegram to view this post
VIEW IN TELEGRAM
👍132👏1👨‍💻1
⌨️ Полезные стримы. Объединение стримов

Даны два списка фруктов. Нужно объединить их в одном стриме, обработать его и вывести результат.


var list1 = List.of("apple", "banana", "cherry");
var list2 = List.of("orange", "pineapple", "mango");

var result = Stream.concat(list1.stream(), list2.stream())
.filter(s -> s.length() > 5)
.toList();

System.out.println(result);
// [banana, cherry, orange, pineapple]


#java #stream #concat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥21👏1
This media is not supported in your browser
VIEW IN TELEGRAM
Переиспользуем код в новом проекте

#java #meme #reuse
😁26👍12🤣2🤗1
⌨️ Модульное и интеграционное тестирование. Назначение и различия

Модульное и интеграционное тестирование — это два различных типа тестирования программного обеспечения, которые служат для разных целей и проводятся на разных этапах процесса разработки.

Модульное тестирование направлено на проверку отдельных частей кода, обычно функций или методов, изолированно от остальных частей системы. Оно позволяет обнаруживать ошибки на ранней стадии разработки, способствует упрощению поиска и исправления дефектов, снижению затрат на исправление ошибок в дальнейшем. В качестве библиотеки для модульного тестирования может быть использована, например JUnit.

Пример: если есть функция, которая выполняет вычисление площади круга, модульный тест будет проверять правильность работы этой функции с разными входными значениями (радиусами).

Интеграционное тестирование направлено на проверку взаимодействия между различными модулями или компонентами системы, чтобы убедиться, что они правильно работают вместе. Одна из библиотек для интеграционного тестирования - TestNG.

Пример: если есть система, состоящая из двух модулей: один выполняет вход пользователя, а другой — отображение информации о пользователе, интеграционный тест проверит, что после успешного входа отображается правильная информация о пользователе.

#java #test #JUnit #TestNG
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51🔥1
class Base {
public String className = "Base";

public String getClassName() {
return className;
}
}

class Derived extends Base {
public String className = "Derived";
}

public class Quest {
public static void main(String[] args) {
System.out.println(new Derived().getClassName());
}
}

#java #quest
👍1
Что выведет код?
Anonymous Quiz
32%
Base
54%
Derived
14%
ошибка компиляции
🤔4👍31
⌨️ Описание и назначение разных циклов

Цикл for со счетчиком

for (initialization; condition; update) {
// тело цикла
}

Описание:
initialization: выполняется один раз перед началом цикла. Обычно используется для инициализации счетчика.

condition: проверяется перед каждой итерацией. Если условие истинно, выполняется тело цикла.

update: выполняется после каждой итерации. Обычно используется для изменения счетчика.


int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {
System.out.println(i + ": " + numbers[i]);
}

Применение:
Используется, когда известно количество итераций заранее. Часто применяется для работы с массивами или коллекциями, когда нужен индекс.


Цикл for-each

for (type element : collection) {
// тело цикла
}

Описание:
Итерируется по каждому элементу коллекции (например, массива, списка, множества). Обеспечивает удобный способ доступа к каждому элементу без использования индексов.


int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
System.out.println(number);
}

Применение:
Предпочтителен, когда не нужен доступ к индексам элементов.


Цикл while

while (condition) {
// тело цикла
}

Описание:
condition: проверяется перед каждой итерацией. Если условие истинно, выполняется тело цикла.


String code = UUID.randomUUID().toString();
boolean isCodeExists = repo.isCodeExists(code);
while (isCodeExists) {
code = UUID.randomUUID().toString();
isCodeExists = repo.isCodeExists(code);
}
repo.saveCode(code);

Применение:
Используется, когда количество итераций неизвестно заранее и определяется во время выполнения программы. Цикл может не выполниться ни одного раза.


Цикл do-while

do {
// тело цикла
} while (condition);

Описание:
Выполняет тело цикла хотя бы один раз, а затем проверяет условие condition. Если условие истинно, цикл повторяется.


String command;
do {
command = readCommand();
doCommand(command);
} while (!"EXIT".equals(command));

Применение:
Используется, когда тело цикла должно выполниться хотя бы один раз, независимо от условия. Часто применяется для меню или ввода данных, где сначала нужно выполнить действие, а затем проверить условие.

#java #cycles #for #while
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥1
Скрытие полей (Hiding Fields)

Внутри класса поле, имеющее то же имя, что и поле суперкласса, скрывает поле суперкласса, даже если их типы различны.

Внутри подкласса на поле суперкласса нельзя ссылаться по простому имени. Вместо этого доступ к полю должен осуществляться через super.

Скрывать поля не рекомендуем, поскольку это затрудняет чтение кода.

#java #HidingFields
4👍4🔥1👏1🤔1
⌨️ Можно ли объявить метод абстрактным и статическим одновременно?

Нет. В таком случае компилятор выдаст ошибку: "Illegal combination of modifiers: ‘abstract’ and ‘static’".

Модификатор abstract говорит, что метод будет реализован в другом классе, а static наоборот указывает, что этот метод будет доступен по имени класса.

#java #abstract #static
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🌐 Bearer-токен — это тип авторизационного токена, который предоставляется пользователю после успешной аутентификации для доступа к защищенным ресурсам. Этот токен обычно представляет собой строку, которую пользователь должен передавать в заголовке HTTP-запроса для каждого запроса к защищенному сервису или приложению.

Bearer-токен используется для идентификации пользователя и предоставления доступа к его личным данным или другим защищенным ресурсам. Он должен храниться в безопасном месте и не передаваться третьим лицам.

Bearer-токен обеспечивает простой механизм аутентификации и авторизации пользователей без необходимости использования cookies или сессий. Он является частью стандарта аутентификации OAuth 2.0 и широко используется во многих современных веб-приложениях и API.

Пример запроса:

GET /api/resource HTTP/1.1
Host: example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvZSBEb2UiLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNTE2MjM5MDIyfQ.SdUMMAsFFk83SHyqGjfQ1pt8v_8t4WZku5Ty3CLMaH4


В данном примере Bearer token представлен в заголовке Authorization. Вместо значения Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvZSBEb2UiLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNTE2MjM5MDIyfQ.SdUMMAsFFk83SHyqGjfQ1pt8v_8t4WZku5Ty3CLMaH4 должен быть ваш актуальный Bearer-токен для доступа к защищенным ресурсам.

Обычно, чтобы получить этот токен, нужно сделать запрос на авторизацию, и в ответе приходит этот токен.

Пример запроса:

POST /login HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 52

{
"username": "admin",
"password": "admin"
}


Пример ответа:

{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvZSBEb2UiLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNTE2MjM5MDIyfQ.SdUMMAsFFk83SHyqGjfQ1pt8v_8t4WZku5Ty3CLMaH4","username":"admin"}


#java #OAuth #Bearer
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20
Ссылки на методы — это способ упрощенного вызова методов или конструктора, который позволяет передавать их как аргументы в методы или сохранять в переменных. Ссылки на методы появились в Java 8 и являются частью улучшенной поддержки функционального программирования в языке.

Есть несколько видов ссылок на методы:

1️⃣ Ссылка на статический метод
Используется для вызова статических методов класса.
Синтаксис:

ContainingClass::staticMethodName

Пример:

import java.util.function.Function;

public class MethodReferenceExample {
public static void main(String[] args) {
Function<String, Integer> converter = Integer::parseInt;
Integer number = converter.apply("123");
System.out.println(number); // 123
}
}


2️⃣ Ссылка на метод экземпляра конкретного объекта
Используется для вызова методов экземпляра объекта.
Синтаксис:

containingObject::instanceMethodName

Пример:

import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);
}
}


3️⃣ Ссылка на метод экземпляра произвольного объекта определенного типа
Синтаксис:

ContainingType::methodName

Пример:

import java.util.function.Function;

public class FunctionExample {
public static void main(String[] args) {
Function<String, Integer> stringLength = String::length;
Integer length = stringLength.apply("Hello, World!");
System.out.println(length); // 13
}
}


Отличие от предыдущего вида в том, что в предыдущем ссылка на метод получается у конкретного объекта, стало быть вызовется метод этого объекта, а в нашем случае при получении ссылки на метод, мы знаем только метод, но объект у которого вызовется этот метод еще не известен, он будет предоставлен при вызове метода. Код выше будет означать "Hello, World!".length()

4️⃣ Ссылка на конструктор
Используется для вызова конструктора.
Синтаксис:

ClassName::new

Пример:

import java.util.function.Supplier;

public class MethodReferenceExample {
public static void main(String[] args) {
Supplier<MethodReferenceExample> exampleSupplier = MethodReferenceExample::new;
MethodReferenceExample example = exampleSupplier.get();
System.out.println(example); // MethodReferenceExample@<hashcode>
}
}


#java #MethodReference
👍192🫡1
⌨️ Функциональный интерфейс Function является частью пакета java.util.function и предназначен для представления функций, принимающих один аргумент и возвращающих результат. Этот интерфейс широко используется в функциональном программировании и особенно полезен при работе с лямбда-выражениями и методами, которые принимают функции в качестве параметров.

Интерфейс Function аннотирован @FunctionalInterface, что означает, что он предназначен для использования с лямбда-выражениями и содержит ровно один абстрактный метод:

R apply(T t);

Принимает один аргумент типа T и возвращает результат типа R.

Пример:

Function<String, Integer> stringLength = String::length;
Integer length = stringLength.apply("Hello, World!");
System.out.println(length); // 13


Еще один:

Function<Double, Double> areaOfCircle = r -> Math.PI * r * r;
System.out.println(areaOfCircle.apply(5.0));
// 78.53981633974483


#java #function
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
⌨️ Полезные стримы. Метод distinct()

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


var list = Arrays.asList(1, 2, 3, 3, 4, 5, 5);
var distinctList = list.stream()
.distinct()
.collect(Collectors.toList());
// distinctList: [1, 2, 3, 4, 5]


#java #stream #distinct
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥21👏1