Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»ΡΠ±ΠΎΠΊΠΎΠΉ ΠΈ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠ½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² Java
ΠΡΡΠΎΡΠ½ΠΈΠΊ:
DZone
Π ΡΡΠΎΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ Π΄Π²Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² Java: Π³Π»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΡ ΡΠ·Π½Π°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΏΡΠΎΡΡΡΡ
ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ
.
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ Π² 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);
}
}
ΠΠΎΠ΄ΡΠ»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡ
ΠΠ°Π²Π°ΠΉΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΡΡΡ
ΡΠ΅ΡΡΠΎΠ² Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π°ΡΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π³Π»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ ΠΈ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
public class ShallowAndDeepCopyUnitTest {
@Test
public void givenCircle_whenDeepCopy_thenDifferentObjects() {
CopyUtil util=new CopyUtil();
Point center = new Point(3, 5);
Circle original;
original = new Circle(center, 10);
Circle copied = util.deepCopyCircle(original);
assertNotSame(original, copied);
Assert.assertNotSame(original.center, copied.center);
}
@Test
public void givenCircle_whenShallowCopy_thenSameCenter() {
CopyUtil util=new CopyUtil();
Point center = new Point(7, 9);
Circle original = new Circle(center, 15);
Circle copied = util.shallowCopyCircle(original);
assertNotSame(original, copied);
assertSame(original.center, copied.center);
}
}
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»ΡΠ±ΠΎΠΊΠΈΡ
ΠΈ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠ½ΡΡ
ΠΊΠΎΠΏΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² Java ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ
Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΡΠ»ΠΎΡ. ΠΠΎΠ½ΠΈΠΌΠ°Ρ ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡ Π΅Π΅ Π² ΡΠ²ΠΎΠΈΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ
Π½Π° Java, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ Π²Π°ΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΊΠΎΠΏΠΈΡΡΡΡΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π²Π°ΡΠΈΠΌ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡΠΌ.
Java Stream API: ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ map() ΠΈ FlatMap()
ΠΡΡΠΎΡΠ½ΠΈΠΊ:
Medium
ΠΡΠΎΡΠΈΡΠ°Π² ΡΡΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ, Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΈ Π² ΠΊΠ°ΠΊΠΈΡ
ΡΡΠ΅Π½Π°ΡΠΈΡΡ
ΡΡΠΎΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ map, Π° ΠΊΠΎΠ³Π΄Π° flatMap.
map ΠΈ
flatMap β ΡΡΠΎ Π΄Π²Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² Java Stream API, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΏΠΎΡΠΎΠΊΠ΅. ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΈ ΡΠ»ΡΠΆΠ°Ρ ΡΠ°Π·Π½ΡΠΌ ΡΠ΅Π»ΡΠΌ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΡΠ°Π·Π½ΡΡ
ΡΠ»ΡΡΠ°ΡΡ
.
map:
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ map ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² ΠΏΠΎΡΠΎΠΊΠ΅, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΠΌΡ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ (one-to-one mapping). ΠΠ½Π° ΡΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π²ΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ.
flatMap:
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ
flatMap ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΏΠΎΡΠΎΠΊΠ° Π² ΠΏΠΎΡΠΎΠΊ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². ΠΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡΡΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ.
ΠΠΎΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ ΠΈΠ· ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½ΡΡΡ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ
map ΠΈ
flatMap. ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, ΡΡΠΎ Ρ Π²Π°Ρ Π΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ Π»ΡΠ΄Π΅ΠΉ, ΠΈ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ° Π΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠ²ΠΎΠΈΡ
Π»ΡΠ±ΠΈΠΌΡΡ
ΡΠ²Π΅ΡΠΎΠ². ΠΡ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΠ·Π²Π»Π΅ΡΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° Π»ΡΠ΄Π΅ΠΉ Π²ΡΠ΅ ΠΈΡ
Π»ΡΠ±ΠΈΠΌΡΠ΅ ΡΠ²Π΅ΡΠ°. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ Stream API, Π²Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ map ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π»ΡΠ±ΠΈΠΌΡΡ
ΡΠ²Π΅ΡΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ°, Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ
flatMap ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΡΡ Π²ΡΠ΅ ΡΠ²Π΅ΡΠ° ΠΈΠ· Π²ΡΠ΅Ρ
ΡΠΏΠΈΡΠΊΠΎΠ² Π±Π΅Π· ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌΡ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΡ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠ΄Π°. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
map:
import java.util.*;
import java.util.stream.Collectors;
class Person {
private String name;
private List<String> favoriteColors;
public Person(String name, List<String> favoriteColors) {
this.name = name;
this.favoriteColors = favoriteColors;
}
public List<String> getFavoriteColors() {
return favoriteColors;
}
}
public class MapVsFlatMapExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", Arrays.asList("Red", "Blue")),
new Person("Bob", Arrays.asList("Green", "Yellow")),
new Person("Charlie", Arrays.asList("Purple"))
);
List<List<String>> allFavoriteColors = people.stream()
.map(Person::getFavoriteColors)
.collect(Collectors.toList());
System.out.println(allFavoriteColors);
}
}
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ
map ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π»ΡΠ±ΠΈΠΌΡΡ
ΡΠ²Π΅ΡΠΎΠ² ΡΠ°ΠΊ, ΡΡΠΎ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠ΅Π½Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠΎΠ² Π»ΡΠ±ΠΈΠΌΡΡ
ΡΠ²Π΅ΡΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ°.
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΊΠΎΠ΄ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
flatMap:
import java.util.*;
import java.util.stream.Collectors;
class Person {
private String name;
private List<String> favoriteColors;
public Person(String name, List<String> favoriteColors) {
this.name = name;
this.favoriteColors = favoriteColors;
}
public List<String> getFavoriteColors() {
return favoriteColors;
}
}
public class MapVsFlatMapExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", Arrays.asList("Red", "Blue")),
new Person("Bob", Arrays.asList("Green", "Yellow")),
new Person("Charlie", Arrays.asList("Purple"))
);
List<String> allFavoriteColors = people.stream()
.flatMap(person -> person.getFavoriteColors().stream())
.collect(Collectors.toList());
System.out.println(allFavoriteColors);
}
}
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ
flatMap ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ²Π΅Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° Π»ΡΠ±ΠΈΠΌΡΡ
ΡΠ²Π΅ΡΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ°, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠ΅Π½Ρ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠΏΠΈΡΠΊΠΎΠ², Π° ΠΎΠ΄ΠΈΠ½ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ
Π»ΡΠ±ΠΈΠΌΡΡ
ΡΠ²Π΅ΡΠΎΠ² Π±Π΅Π· ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΡ.
ΠΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ map:
- ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΠΎΡΠΎΠΊΠ° Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ.
- ΠΡΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π²Ρ
ΠΎΠ΄Π½ΡΠΌΠΈ ΠΈ Π²ΡΡ
ΠΎΠ΄Π½ΡΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΠ΅ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ βΠΎΠ΄ΠΈΠ½ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡβ.
ΠΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ flatMap:
- ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ.
- ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΡΡΡΡΠΊΡΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΠΈΡΠΊΠΈ Π²Π½ΡΡΡΠΈ ΡΠΏΠΈΡΠΊΠΎΠ²) Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ.
- ΠΡΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π²Ρ
ΠΎΠ΄Π½ΡΠΌΠΈ ΠΈ Π²ΡΡ
ΠΎΠ΄Π½ΡΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ²ΡΠ·Ρ βΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌβ ΠΈΠ»ΠΈ βΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌβ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ,
map ΠΈ
flatMap ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ. ΠΠΏΠ΅ΡΠ°ΡΠΈΡ map ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² Π΄ΡΡΠ³ΠΎΠΉ, Π°
flatMap ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.