DevLog ๐Ÿ˜ถ

[๋ชจ๋˜์ž๋ฐ”์ธ์•ก์…˜] ์ŠคํŠธ๋ฆผ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ? ๋ณธ๋ฌธ

๐Ÿ“–/Modern Java in Action

[๋ชจ๋˜์ž๋ฐ”์ธ์•ก์…˜] ์ŠคํŠธ๋ฆผ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

dolmeng2 2023. 4. 7. 11:49

๐Ÿ’ฌ ๋ชจ๋˜ ์ž๋ฐ” ์ธ ์•ก์…˜ ์ฑ•ํ„ฐ 4์„ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

 


โœ”๏ธ ์ŠคํŠธ๋ฆผ์ด๋ž€?

์ž๋ฐ” 8์— ์ƒˆ๋กญ๊ฒŒ ๋“ค์–ด์˜จ ๊ธฐ๋Šฅ ์ค‘, ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ๋งํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ์˜ ๋ฐ˜๋ณต์„ ๋„์™€์ฃผ๊ณ , ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ ์—†์ด ๋ณ‘๋ ฌ์„ฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์•„์ฃผ ์œ ์šฉํ•œ ์นœ๊ตฌ์ด๋‹ค.

๋˜ํ•œ, filter๋‚˜ sorted, map, collect ๊ฐ™์€ ์—ฐ์‚ฐ์€ ‘high-level building block’์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ŠคํŠธ๋ฆผ์„ ๋งˆ์น˜ ๋ธ”๋ก์ฒ˜๋Ÿผ ์Œ“๊ณ , ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ํฐ ํŠน์ง•์ด๋‹ค.

 


โœ”๏ธ stream ๋ฉ”์„œ๋“œ

๐ŸŒฑ ์ŠคํŠธ๋ฆผ์ด๋ž€, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์„ ์œ„ํ•ด ์†Œ์Šค์—์„œ ์ถ”์ถœ๋œ ์—ฐ์†๋œ ์š”์†Œ์ด๋‹ค.

1) ์—ฐ์†๋œ ์š”์†Œ 

์ปฌ๋ ‰์…˜์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์˜€๋‹ค๋ฉด, ์ŠคํŠธ๋ฆผ์€ ์ด๋ฅผ ์–ด๋–ค ์‹์œผ๋กœ ๊ณ„์‚ฐํ• ์ง€์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค.

๋‘ ๊ฐ€์ง€ ๋ชจ๋‘, ์—ฐ์†๋œ ๊ฐ’ ์ง‘ํ•ฉ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

2) ์†Œ์Šค

๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•œ๋‹ค.

์ŠคํŠธ๋ฆผ์—๊ฒŒ ์ œ๊ณตํ•œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ •๋ ฌ๋˜์—ˆ๋‹ค๋ฉด ํ•ด๋‹น ์ŠคํŠธ๋ฆผ์—์„œ๋„ ๋ฆฌ์ŠคํŠธ๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.

 

3) ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์—ฐ์‚ฐ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์—ฐ์‚ฐ๊ณผ ๋น„์Šทํ•œ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ˆœ์ฐจ/๋ณ‘๋ ฌ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋˜ํ•œ, ์ŠคํŠธ๋ฆผ์€ ์ž๊ธฐ ์ž์‹ ์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒด์ด๋‹์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ํ†ตํ•ด ๋ฐ˜๋ณต์„ ์ง„ํ–‰ํ•œ๋‹ค.

 

๊ธ€๋กœ ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด์ž.

// course
public enum Course {
    BACKEND, FRONTEND, ANDROID
}

// crew
public class Crew {
    private final String name;
    private final String nickname;
    private final int age;
    private final Course course;

    public Crew(final String name, final String nickname, final int age, final Course course) {
        this.name = name;
        this.nickname = nickname;
        this.age = age;
        this.course = course;
    }
}

์šฐ๋ฆฌ๋Š” ๋ฐฑ์—”๋“œ ๊ณผ์ •์ธ ํฌ๋ฃจ๋ฅผ ์ตœ๋Œ€ 10๋ช… ๋ฝ‘์•„ ํ•ด๋‹น ํฌ๋ฃจ์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ด๋‹ค.

๋งˆ์น˜, DB์— ์ฟผ๋ฆฌ๋ฅผ ์งˆ์˜๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์ด๋‹ค. 

์ŠคํŠธ๋ฆผ์„ ํ™œ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  List<String> backendCrews = crews.stream()
                // ๋žŒ๋‹ค์˜ ์ธ์ˆ˜(๋ฐฑ์—”๋“œ ํฌ๋ฃจ)๋ฅผ ๋ฐ›์•„ ํŠน์ • ์š”์†Œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
                .filter(crew -> crew.getCourse() == Course.BACKEND)
                // ๋žŒ๋‹ค๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ์š”์†Œ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
                .map(Crew::getName)
                // ์ŠคํŠธ๋ฆผ ํฌ๊ธฐ์˜ ์ตœ๋Œ€ ์‚ฌ์ด์ฆˆ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
                .limit(10)
                // ์ŠคํŠธ๋ฆผ์„ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. (์—ฌ๊ธฐ์„œ๋Š” ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜)
                .collect(Collectors.toUnmodifiableList());

์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š”, ํฌ๋ฃจ ๋ฆฌ์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ๊ฐ๊ฐ์˜ ํฌ๋ฃจ์— ๋Œ€ํ•œ ‘์—ฐ์†๋œ ์š”์†Œ’๋ฅผ ์ŠคํŠธ๋ฆผ์—๊ฒŒ ์ œ๊ณตํ•œ๋‹ค.

filter-map-limit-collect๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๋ฉฐ, filter-map-limit์˜ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ํ˜•์ด Stream์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ˜•์„ฑํ•˜๊ฒŒ ๋œ๋‹ค. (์ฒด์ด๋‹์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค!)

 


โœ”๏ธ ์ŠคํŠธ๋ฆผ vs ์ปฌ๋ ‰์…˜

๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ์—ฐ์†๋œ ์š”์†Œ์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

 

๐ŸŒฑ ์—ฐ์‚ฐ ์ธก๋ฉด์—์„œ์˜ ์ฐจ์ด

์ปฌ๋ ‰์…˜์€ ํ•ด๋‹น ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ปฌ๋ ‰์…˜์— ์ถ”๊ฐ€๋‚˜ ์‚ญ์ œ ๋“ฑ์˜ ์—ฐ์‚ฐ์ด ์ฃผ์–ด์ง„๋‹ค๋ฉด ํ•ด๋‹น ์š”์†Œ๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. (ex. ๋งŒํ™”์ฑ…)

ํ•˜์ง€๋งŒ, ์ŠคํŠธ๋ฆผ์€ ์š”์ฒญ ์‹œ์—๋งŒ ํ•ด๋‹น ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. (์ŠคํŠธ๋ฆผ ์ž์ฒด์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค)

๋˜ํ•œ, ์ƒ์‚ฐ์ž-์†Œ๋น„์ž ๊ด€๊ณ„๋กœ ์ธํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ๋งŒ ๊ฐ’์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (ex. ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋กœ๋“œ ์ค‘์ธ ์›นํˆฐ)

 

 

๐ŸŒฑ ์ŠคํŠธ๋ฆผ์€ ํ•œ ๋ฒˆ๋งŒ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค

์ŠคํŠธ๋ฆผ์€ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํƒ์ƒ‰๋œ ์š”์†Œ๋Š” ์†Œ๋น„๋œ๋‹ค. ์žฌํƒ์ƒ‰์„ ์œ„ํ•ด์„œ๋Š” ๋‹ค์‹œ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. 

List<Crew> crews = new ArrayList<>();

Stream<String> backendCrews = crews.stream()
        .filter(crew -> crew.getCourse() == Course.BACKEND)
        .map(Crew::getName)
        .limit(10);

backendCrews.forEach(System.out::println);
backendCrews.forEach(System.out::println); // Error!

Intellij์—์„œ๋Š” ์นœ์ ˆํ•˜๊ฒŒ๋„ ์ŠคํŠธ๋ฆผ์„ ์žฌ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ ค๋ฉด ์œ„์™€ ๊ฐ™์ด ์ด๋ฏธ ์†Œ๋น„๋˜์—ˆ๋‹ค๊ณ  ๋ง์„ ํ•ด์ค€๋‹ค.

 

 

๐ŸŒฑ ์™ธ๋ถ€ ๋ฐ˜๋ณต๊ณผ ๋‚ด๋ถ€ ๋ฐ˜๋ณต

๋˜ํ•œ, ๋ฐ˜๋ณต์— ๋Œ€ํ•ด์„œ๋„ ๋‘˜์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

์ปฌ๋ ‰์…˜์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ฐ˜๋ณต์„ ํ•ด์•ผ ํ•˜์ง€๋งŒ (์™ธ๋ถ€ ๋ฐ˜๋ณต), ์ŠคํŠธ๋ฆผ์€ ๋ฐ˜๋ณต์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•œ๋‹ค. (๋‚ด๋ถ€ ๋ฐ˜๋ณต)

 

์™ธ๋ถ€ ๋ฐ˜๋ณต์€ “๋ช…์‹œ์ ์œผ๋กœ” ๋‚ด๋ถ€ ์š”์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ์ ‘๊ทผํ•˜์—ฌ, ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. 

์ฆ‰, ํฌ๋ฃจ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ํฌ๋ฃจA, ํฌ๋ฃจB, ํฌ๋ฃจC… ํฌ๋ฃจZ๊นŒ์ง€, ๋ชจ๋“  ํฌ๋ฃจ๋“ค์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

: ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ, ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌ.

// Iterator ์‚ฌ์šฉ
List<String> names = new ArrayList<>();
    Iterator<String> iterator = crews.iterator();
    while(iterator.hasNext()) {   
        Crew crew = iterator.next();
        names.add(dish.getName());
}

// for-each ์‚ฌ์šฉ
List<String> names = new ArrayList<>();
for (Crew crew : crews) {
    names.add(crew.getName());
}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž. ๋‘ ์ฝ”๋“œ ๋ชจ๋‘ ์ง์ ‘์ ์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ, ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜, ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ด๋ผ๋ฉด ํฌ๋ฃจ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด์„œ ๋‹ค๋ฅธ ํ–‰์œ„๋„ ํ•  ์ˆ˜ ์žˆ๊ณ  (map, filter...),

์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ํฌ๋ฃจA, ํฌ๋ฃจC… ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ณ‘๋ ฌ์ ์œผ๋กœ๋„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

: ๊ฐœ๋ฐœ์ž๋Š” ๋‹จ์ˆœํžˆ ์ฒ˜๋ฆฌ ๊ณผ์ •๋งŒ ์ •์˜ํ•˜๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ ์ŠคํŠธ๋ฆผ์ด ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ฒ˜๋ฆฌ.

Stream<String> backendCrews = crews.stream()
        .map(Crew::getName)
        .limit(10);

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž. map์„ ํ†ตํ•ด ํฌ๋ฃจ๋“ค์˜ ์ด๋ฆ„์„ ์‚ฐ์ถœํ•˜๊ณ  ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ฐœ๋ฐœ์ž๋Š” 'map์„ ํ†ตํ•ด ํฌ๋ฃจ๋“ค์˜ ์ด๋ฆ„์œผ๋กœ ๋งคํ•‘์‹œํ‚ค๋Š” ํ–‰์œ„'๋งŒ์„ ์ง€์ •ํ•ด์ฃผ๊ณ  ์žˆ์œผ๋ฉฐ, ์ŠคํŠธ๋ฆผ์€ ๋‚ด๋ถ€์ ์œผ๋กœ crew ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ๋ฉด์„œ ๋งคํ•‘ํ•ด์ฃผ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค. ๋ณ„๋„์˜ ๋ฐ˜๋ณต์ž๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

 


โœ”๏ธ ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ

์ŠคํŠธ๋ฆผ์€ ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

 

๐ŸŒฑ ์ค‘๊ฐ„ ์—ฐ์‚ฐ

์—ฐ์‚ฐ ๋ฐ˜ํ™˜ ํ˜•์‹ ์—ฐ์‚ฐ์˜ ์ธ์ˆ˜ ํ•จ์ˆ˜ ๋””์Šคํฌ๋ฆฝํ„ฐ
filter Stream<T> Predicate<T> T -> boolean
map Stream<R> Function<T, R> T -> R
limit Stream<T>    
sorted Stream<T> Comparator<T> (T, T) -> int
distinct Stream<T>    

 

๐ŸŒฑ ์ตœ์ข… ์—ฐ์‚ฐ

์—ฐ์‚ฐ ๋ฐ˜ํ™˜ ํ˜•์‹ ๋ชฉ์ 
forEach void ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ๋ฅผ ์†Œ๋น„ํ•˜๋ฉด์„œ ๋žŒ๋‹ค๋ฅผ ์ ์šฉํ•œ๋‹ค.
count long (generic) ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
collect   ์ŠคํŠธ๋ฆผ์„ ๋ฆฌ๋“€์Šคํ•ด์„œ ๋ฆฌ์ŠคํŠธ, ๋งต, ์ •์ˆ˜ ํ˜•์‹์˜ ์ปฌ๋ ‰์…˜์„ ๋งŒ๋“ ๋‹ค.

 

์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜๋ฉด ๋ฐ˜ํ™˜ํ˜•์ด Stream์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์† ์ฒด์ด๋‹์„ ํ†ตํ•ด์„œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ตœ์ข… ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์•„๋ฌด ์—ฐ์‚ฐ๋„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด ํŠน์ง•์ด๋‹ค. (์ฑ…์—์„œ๋Š” ๊ฒŒ์œผ๋ฅด๋‹ค๊ณ  ํ‘œํ˜„ํ–ˆ๋‹ค)

๊ทธ๋ฆฌ๊ณ , ์ตœ์ข… ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜๋ฉด ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๊ฒŒ ๋˜๋ฉฐ, Streamํ˜•์ด ์•„๋‹Œ List(Collectors.toUnmodifiableList()), void(forEach), long(count) ๋“ฑ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

List<Crew> crews = List.of(Crew.createByName("์ด๋ฆ„1", 20, Course.BACKEND),
                Crew.createByName("์ด๋ฆ„2", 21, Course.BACKEND),
                Crew.createByName("์ด๋ฆ„3", 22, Course.BACKEND),
                Crew.createByName("์ด๋ฆ„4", 23, Course.BACKEND));

์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž. ํฌ๋ฃจ์— ๋Œ€ํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •์˜ํ•ด๋‘” ๊ฒƒ์ด๋‹ค.

Stream<String> names =
        crews.stream()
                .filter(crew -> {
                    System.out.println("filter: " + crew.getName());
                    return crew.getAge() > 20;
                })
                .map(crew -> {
                    System.out.println("map: " + crew.getName());
                    return crew.getName();
                })
                .limit(2);

์ด๋•Œ, ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด (์ค‘๊ฐ„ ์—ฐ์‚ฐ์˜ ๋ชจ์Œ) ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ๊นŒ?

๋†€๋ž๊ฒŒ๋„ ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค. 

์ŠคํŠธ๋ฆผ์€ ์ตœ์ข… ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜๊ธฐ ์ „๊นŒ์ง€, ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒŒ ์ด๋Ÿฐ ์˜๋ฏธ์ด๋‹ค.

List<String> names =
        crews.stream()
                .filter(crew -> {
                    System.out.println("filter: " + crew.getName());
                    return crew.getAge() > 20;
                })
                .map(crew -> {
                    System.out.println("map: " + crew.getName());
                    return crew.getName();
                })
                .limit(2)
                .collect(toList());
                
 System.out.println("names = " + names);

๋ฐ˜๋ฉด์—, collect๋ฅผ ํ†ตํ•ด ์ตœ์ข… ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

์‹คํ–‰ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

์ตœ์ข… ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„ ์—ฐ์‚ฐ์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, limit๋ฅผ ํ†ตํ•ด ์ตœ๋Œ€ 2๊ฐœ๊นŒ์ง€๋งŒ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ฒ˜์Œ๋ถ€ํ„ฐ ์กฐ๊ฑด์— '์ด๋ฆ„4'๋Š” ๋“ค์–ด๊ฐ€์ง€ ์•Š์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ '์‡ผํŠธ ์„œํ‚ท' ์—ฐ์‚ฐ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์ฃผ์–ด์ง„ ํฌ๊ธฐ์˜ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ทธ๋งŒํผ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝํ•˜๋ฉฐ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

1. ์งˆ์˜๋ฅผ ์ˆ˜ํ–‰ํ•  ๋ฐ์ดํ„ฐ ์†Œ์Šค
2. ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•  ์ค‘๊ฐ„ ์—ฐ์‚ฐ ์—ฐ๊ฒฐํ•˜๊ธฐ
3. ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ตœ์ข… ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋„์ถœํ•˜๊ธฐ
Comments