JavaRush/Java Π±Π»ΠΎΠ³/Random/ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #255. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΉ ΠΈ повСрхностной ΠΊΠΎΠΏΠΈΠΈ ...

ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #255. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΉ ΠΈ повСрхностной ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Java Stream API: ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ map() ΠΈ FlatMap()

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ Random
участников

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

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: DZone Π’ этом руководствС рассмотрСны Π΄Π²Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ копирования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Java: Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ повСрхностноС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… простых ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…. ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #255. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΉ ΠΈ повСрхностной ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Java Stream API: ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ map() ΠΈ FlatMap() - 1ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π² 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);
        //[[Red, Blue], [Green, Yellow], [Purple]]
    }
}
Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ опСрация 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);
        //[Red, Blue, Green, Yellow, Purple]
    }
}
Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ опСрация flatMap ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ ΠΈΠ· списка Π»ΡŽΠ±ΠΈΠΌΡ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ получаСтся Π½Π΅ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… списков, Π° ΠΎΠ΄ΠΈΠ½ большой список всСх Π»ΡŽΠ±ΠΈΠΌΡ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ² Π±Π΅Π· привязки ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ.

Когда Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ map:

  1. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.
  2. Если ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ элСмСнтами сущСствуСт ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠ΅ сопоставлСниС β€œΠΎΠ΄ΠΈΠ½ ΠΊ одному”.

Когда Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ flatMap:

  1. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² нСсколько элСмСнтов ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.
  2. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ структуру (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, списки Π²Π½ΡƒΡ‚Ρ€ΠΈ списков) Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ.
  3. Если ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ элСмСнтами сущСствуСт связь β€œΠΎΠ΄ΠΈΠ½ ΠΊΠΎ многим” ΠΈΠ»ΠΈ β€œΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎ многим”.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, map ΠΈ flatMap ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сцСнариСв трансформации. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ map ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ элСмСнт Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π° flatMap ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ элСмСнт Π² нСсколько элСмСнтов ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.
ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ
  • популярныС
  • Π½ΠΎΠ²Ρ‹Π΅
  • старыС
Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ
Π£ этой страницы Π΅Ρ‰Π΅ Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ коммСнтария