461 подписчик
1271. Какие отличия между методами map и flatMap? В Java методы map() и flatMap() используются в контексте Stream API для обработки коллекций. Основное различие между двумя методами заключается в следующем: Другими словами, map() преобразует каждый элемент потока в другой элемент, а flatMap() преобразует каждый элемент в поток элементов, а затем объединяет все потоки в один поток. Вот пример использования map() для преобразования списка строк в список их длин: List<String> strings = Arrays.asList("foo", "bar", "baz"); List<Integer> lengths = strings...
8 месяцев назад
55 подписчиков
🖇 Создание глубокой и поверхностной копии объекта.
Java Stream API: когда использовать map() и FlatMap()

При работе с объектами в Java бывают случаи, когда вам необходимо создать копию объекта. Однако не все копии одинаковы. Существует два основных способа копирования объектов: глубокое копирование (Deep Copy) и поверхностное копирование (Shallow Copy).

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

Поверхностное копирование: в чем разница?
С другой стороны, поверхностное копирование создает копию объекта, не зная о структуре класса, который он копирует. То есть, объект копируется без содержащихся в нем вложенных объектов. По умолчанию в Java применяется поверхностное копирование. Для этого используется метод clone().

Давайте применим копирование на практике: пример фигур
Представьте, что у вас есть класс с именем Circle, в котором есть вложенный объект класса Point, представляющий его центр. Сейчас мы увидим, как глубокое и поверхностное копирование работают с этими объектами.

public class Circle {
public Point center;
public int radius;

public Circle(Point center, int radius) {
this.center = center;
this.radius = radius;
}
}

public class Point {
public int x, y;

public Point(int x, int y) {
this.x = x;
this.y = y;
}
}

Создание поверхностной копии
Для поверхностного копирования мы просто копируем ссылки на вложенные объекты:

public Circle shallowCopyCircle(Circle original) {
return new Circle(original.center, original.radius);
}

Создание глубокой копии
ля глубокой копии Circle нам нужно создать новые экземпляры объектов Point и Circle.

public Circle deepCopyCircle(Circle original) {
Point copiedPoint = new Point(original.center.x, original.center.y);
return new Circle(copiedPoint, original.radius);
}

Создание простого класса CopyUtil
Вот класс утилиты с кодом копирования объектов:

public class CopyUtil {
public Circle deepCopyCircle(Circle original) {
Point copiedPoint = new Point(original.center.x, original.center.y);
return new Circle(copiedPoint, original.radius);
}
public Circle shallowCopyCircle(Circle original) {
return new Circle(original.center, original.radius);
}
}

Модульные тесты
Давайте напишем несколько простых тестов для проверки наших методов глубокого и поверхностного копирования.


9 месяцев назад