๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JAVA

[Java] stream()ํ•จ์ˆ˜๋ž€(map, toList ํ™œ์šฉ ์˜ˆ์ œ)

by ์šฐ์ฃผ๋ฌผ๊ณ ๊ธฐ 2025. 5. 4.
๋ฐ˜์‘ํ˜•

 

๊ณต์‹๋ฌธ์„œ :

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/Stream.html

 

Stream (Java SE 11 & JDK 11 )

A sequence of elements supporting sequential and parallel aggregate operations. The following example illustrates an aggregate operation using Stream and IntStream: int sum = widgets.stream() .filter(w -> w.getColor() == RED) .mapToInt(w -> w.getWeight())

docs.oracle.com

 

Java์˜ stream()ํ•จ์ˆ˜๋Š”

โ€‹

Collection(ex. List, Set)์„ ๋ฐ›์•„์„œ

Stream<T>๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ž„.

 

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Angela", "Charlie");

        names.stream() // ์ŠคํŠธ๋ฆผ ์‹œ์ž‘
             .filter(name -> name.startsWith("A")) // 'A'๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด๋ฆ„๋งŒ ๊ณจ๋ผ
             .map(String::toUpperCase)             // ๋Œ€๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”
             .forEach(System.out::println);        // ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅ
    }
}


>> ์ถœ๋ ฅ ๊ฒฐ๊ณผ
ALICE  
ANGELA

 

์ง€ํ”ผํ‹ฐ๊ฐ€ ์จ์ค€ ์˜ˆ์ œ ์ฝ”๋“œ.

โ€‹

์œ„ ์˜ˆ์ œ์—์„œ๋Š” name๋ผ๋Š” ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ’ ํ•˜๋‚˜์”ฉ ์จ๋‚ด์„œ

ํ•„ํ„ฐ๋ง, ๋งคํ•‘, ์ •๋ ฌ ๋“ฑ๋“ฑํ•ด์„œ for๋ฌธ์ฒ˜๋Ÿผ ๋ฐ˜๋ณตํ•ด์„œ ์ถœ๋ ฅํ•จ.

โ€‹

โ€‹

โ€‹

์ž์ฃผ ์“ฐ๋Š” Stream๋ฉ”์†Œ๋“œ๋Š”

 

์ฒจ์—๋Š” ์ด Stream() ํ•จ์ˆ˜์˜ ์—ญํ• ์ด ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๊ฐ”์Œ

โ€‹

๊ฑ ๋Œ€์ถฉ for๋ฌธ์ด๋ž‘ ๋น„์Šทํ•œ๊ฑด๊ฐ€ ํ–ˆ๋Š”๋ฐ

Collectionํƒ€์ž…๋“ค์„ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Œ.

โ€‹

for๋ฌธ๋ณด๋‹ค ๋‹น์—ฐํžˆ ๊ฐ€๋…์„ฑ๋„ ์ข‹๊ณ 

 

 

 

 


์•„๋ž˜๋Š” ๋‚ด๊ฐ€ ์ ์šฉํ•œ ์˜ˆ์‹œ

 

@GetMapping("/api/articles")
    public ResponseEntity<List<ArticleResponseDto>> findAllArticles() {

        List<ArticleResponseDto> articles = blogService.findAll()
                .stream()
                .map(ArticleResponseDto::new)
                .toList();

        return ResponseEntity.ok()
                .body(articles);

    }



// findAll()ํ•จ์ˆ˜๋Š” list<Article>์„ return
public List<Article> findAll() {
        return blogRepository.findAll();
}

 

controller์—์„œ streamํ•จ์ˆ˜ ์‚ฌ์šฉ์ค‘์ž„

โ€‹

โ€‹

์ˆœ์„œ๋Œ€๋กœ ๋ณด๋ฉด,

1. blogService.findAll()ํ•จ์ˆ˜ ์จ์„œ List<Article>์„ ๋ฆฌํ„ด ๋ฐ›์Œ.

2. .stream() : stream()ํ•จ์ˆ˜ ์จ์„œ stream<Article>๋กœ ๋ณ€ํ™˜

3. .map() : mapํ•จ์ˆ˜ ์จ์„œ Article์„ new ArticleResponseDto๋กœ ๋ณ€ํ™˜

= stream<ArticleResponseDto> ๊ฐ€ ์ƒ์„ฑ๋จ

4. toList() : ๋‹ค์‹œ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜

= List<ArticleResponseDto>๊ฐ€ ์ƒ์‹ฌ

โ€‹

---> List<Article>์„ ๋ฐ›์€๋‹ค์Œ, List<ArticleResponseDto>๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •

 

 


โ€‹

Article์„ ArticleResponseDto๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ

โ€‹

๊ฐ‘์ž๊ธฐ ํ•˜๋‹ค๋ณด๋‹ˆ๊นŒ entity๋ž‘ dto์— ๋Œ€ํ•ด์„œ ํ—ท๊ฐˆ๋ฆฌ๋Š”๊ฒŒ ์ƒ๊ฒจ์„œ

๋‚ด๊ฐ€ ๊ธฐ์–ตํ•  ๊ฒธ ์ž์„ธํžˆ ์ ์–ด๋ณด์ž๋ฉด

โ€‹

dto๋Š” ๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ์šด๋ฐ˜์šฉ๋„์ž„. (๋ฐ˜์ฐฌํ†ต๊ฐ™์€ ๋А๋‚Œ)

--> ๋‹น์—ฐํžˆ dto์— ์žˆ๋Š” ํ•„๋“œ๋Š” entity์— ์žˆ๋Š” ์ปฌ๋Ÿผ์ผ๊ฒƒ์ด๊ณ ,

๊ทธ๊ฑธ ๋งคํ•‘ํ•˜๋Š”๊ฑด

โ€‹

.map(ArticleResponseDto::new)

์ด ๋ถ€๋ถ„์ธ๋ฐ, ์ด๊ฒŒ

 

@Getter
public class ArticleResponseDto {

    private final String title;
    private final String content;

    public ArticleResponseDto(Article article) {
        this.title = article.getTitle();
        this.content = article.getContent();
    }

}

 

์—ฌ๊ธฐ ์žˆ๋Š” ์ƒ์„ฑ์ž ํ˜ธ์ถœํ•ด์„œ

ArticleResponseDto ๊ฐ์ฒด ์ƒ์„ฑ, ์ดˆ๊ธฐํ™” ํ•˜๊ณ ์žˆ๋Š”๊ฑฐ์ž„!!!

โ€‹

Article article์„ ๋ฐ›์•„์„œ ์ดˆ๊ธฐํ™”์ค‘

โ€‹

.map(ArticleResponseDto::new)๊ฐ€ ์š”๊ฑธ ํ•ด์ฃผ๊ณ  ์žˆ๋Š”๊ฒƒ..

โ€‹

โ€‹

โ€‹

์ฐธ๊ณ ๋กœ .map(ArticleResponseDto::new)๋Š” ๋žŒ๋‹ค์‹์ž…๋‹ˆ๋‹ค.

๋ฉ”์†Œ๋“œ ์ฐธ์กฐ(method refernce)๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋žŒ๋‹ค์‹์˜ ํ•œ ์ข…๋ฅ˜

 

.map(article -> new ArticleResponseDto(article))

โ€‹์ด๊ฒŒ ์ผ๋ฐ˜ ๋žŒ๋‹ค์‹

 

์ด๊ฑธ ์ค„์ธ๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์Œ.

 

.map(ArticleResponseDto::new)

 

๋ฐ˜์‘ํ˜•