```
For loop 대신 Stream을 사용하는 2가지 이유
```

이번 글을 통해 배워갈 내용
- Stream에 대한 설명
- For loop와 비교
- Stream을 사용하는 두 가지 이유
Stream에 대한 설명
자바에서는 데이터를 처리할때 배열이나 Collection 등을 사용하는데 이를 정형화된 패턴으로 접근하기 위해서 Stream을 사용합니다.
Stream 특징
1. internal iteration
내부 반복을 통해 작업합니다.
2. parallel Stream
병렬 처리를 지원합니다.
3. Functional Style operation
자료 처리를 수학적 함수의 계산으로 취급하며 무엇을 구현하겠다는 것에 초점을 두고
상태와 가변적 데이터를 배제하는 선언형 프로그래밍입니다.
Stream 동작
생성 변환 사용 순으로 진행됩니다.
풀어서 설명하자면
스트림을 생성하고 중개 연산하고 최종연산을 합니다.
For loop 와 비교
책 클래스를 만들었습니다
import java.util.List;
public class Book {
private final String title;
private final String author;
private final List<String> tag;
public Book(String title, String author, List<String> tag) {
this.title = title;
this.author = author;
this.tag = tag;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public List<String> getTag() {
return tag;
}
}
샘플 책리스트를 만들었습니다.
List<Book> bookList = new ArrayList<>(
Arrays.asList(new Book("김씨이야기1", "김씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("김씨이야기2", "김씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("김씨이야기3", "김씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("김씨이야기4", "김씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("즐거운이야기", "이씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("공포이야기", "박씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("슬픈이야기", "전씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))))
);
해당되는 책들중에 제목에 "김 씨 이야기"를 포함하는 첫 번째 책을 찾고자 한다면
System.out.println(findFirstWithTitle01("김씨이야기", bookList));
System.out.println(findFirstWithTitle02("김씨이야기", bookList));
For 문을 돌릴 경우 아래와 같습니다.
private static String findFirstWithTitle01(String title, List<Book> bookList) {
for (Book book : bookList){
if (book.getTitle().contains(title)){
return book.getTitle();
}
}
return null;
}
하지만 스트림을 돌리면 아래와 같습니다.
private static String findFirstWithTitle02(String title, List<Book> bookList) {
Optional<Book> titleOp = bookList.stream().filter(t->t.getTitle().contains(title)).findFirst();
return titleOp.isPresent() ? titleOp.get().getTitle() : null;
}
스트림에서 Filter 연산을 사용해서 "김씨"를 가진 책을 찾고 findFirst()를 사용해서 첫 번째 나오는 결과를 찾아줍니다.
아래는 전체 코드입니다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
public class App {
public static void main(String[] args) {
// 샘플 북리스트
List<Book> bookList = new ArrayList<>(
Arrays.asList(new Book("김씨이야기1", "김씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("김씨이야기2", "김씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("김씨이야기3", "김씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("김씨이야기4", "김씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("즐거운이야기", "이씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("공포이야기", "박씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))),
new Book("슬픈이야기", "전씨", new ArrayList<>(Arrays.asList("자서전", "추천서"))))
);
System.out.println(findFirstWithTitle01("김씨이야기", bookList));
System.out.println(findFirstWithTitle02("김씨이야기", bookList));
}
private static String findFirstWithTitle01(String title, List<Book> bookList) {
for (Book book : bookList){
if (book.getTitle().contains(title)){
return book.getTitle();
}
}
return null;
}
private static String findFirstWithTitle02(String title, List<Book> bookList) {
Optional<Book> titleOp = bookList.stream().filter(t->t.getTitle().contains(title)).findFirst();
return titleOp.isPresent() ? titleOp.get().getTitle() : null;
}
}
위에 예시는 Stream의 간단한 맛보기 이고
Collect, map, sort, reduce, distinct 등 여러 가지 흥미로운 기능들도 많습니다.
저는 Stream을 처음 배우고 나서 싱글코어에서의 속도 차이가 전부가 아니고
프로그램의 유지보수나 크기가 큰 트래픽 처리에 있어서의 Stream의 장점을 보고 Stream을 선호하는 편입니다.
Stream을 사용하는 두 가지 이유
1.
For Loop처럼 하는 방법을 말하는 대신
Stream처럼 하고 이루고자 하는 바를 말하는 프로그래밍을 함으로써 유지보수가 편함
2.
병렬 처리를 사용하기 때문에 멀티코어 환경인 모던 컴퓨팅에 적합
참조
https://stackoverflow.com/questions/42486428/when-should-i-use-streams
When should I use streams?
I just came across a question when using a List and its stream() method. While I know how to use them, I'm not quite sure about when to use them. For example, I have a list, containing various path...
stackoverflow.com
https://www.baeldung.com/java-functional-programming
Functional Programming in Java | Baeldung
A comprehensive overview of Functional Programming in Java.
www.baeldung.com
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'Java > Java 기타' 카테고리의 다른 글
| JAVA Reducer로 소문자 열 대문자 변환하며 더하는 2가지 방법 (0) | 2022.05.18 |
|---|---|
| 자바 고전적 For loop 대신 IntStream 사용해보기 (0) | 2022.05.15 |
| JAVA 공백으로 띄운 스트링 입력 정수 리스트로 변환하는 3가지 방법 (1) | 2022.05.07 |
| StringBuffer를 쓰는 두가지 이유 그리고 간략한 JAVA StringBuilder, StringBuffer, String 설명 (1) | 2022.03.26 |
| JAVA로 시스템 환경 값 가지고 오기 (0) | 2022.03.25 |