Найти Ρ‚Π΅ΠΌΡƒ
81 подписчик

πŸ–‡ Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΉ ΠΈ повСрхностной ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

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);
}
}

ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ тСсты
Π”Π°Π²Π°ΠΉΡ‚Π΅ напишСм нСсколько простых тСстов для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π°ΡˆΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ ΠΈ повСрхностного копирования.


2 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹