스트림을 왜 써야 하는가?
컬렉션을 대체해 보다 편한 작업을 수행할 수 있도록 도와주는 API
1. 질의어 표현
SELECT NAME
FROM DISHES A
WHERE 1=1
AND A.CALORIES < 400;
SQL은 질의어만 작성하면 어떻게 구현할 것인지에 대해서는 생각하지 않는다.
스트림 이전에 위의 코드를 작성하려면 아래와 같이 일일이 구현해야 한다.
public class Exercise {
public static void main(String[] args) {
List<Dishes> dishes = Arrays.asList(new Dishes("burger", 1000), new Dishes("coffee", 1));
List<Dishes> result = new ArrayList<>();
for(Dishes dish : dishes) {
if(dish.getCalories() < 400) {
result.add(dish);
}
}
}
}
스트림을 사용하면 구현을 생각하지 않고 마치 질의어처럼 편하게 사용이 가능하다.
2. 스레드 구현 없이 병렬로 처리 가능
자바 8 이전의 병렬 처리를 구현하는 것은 복잡하고 디버깅이 어렵다.
스트림을 사용하면 병렬 처리를 보다 쉽게 진행할 수 있다.
스트림의 정의
데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소
- 연속된 요소 : 연속된 값 집합의 인터페이스를 제공 (filter, map, sorted...)
- 소스 : 받은 데이터를 훼손하지 않고 그대로 유지
- 데이터 처리 연산 : 데이터베이스와 같은 연산을 제공
- 파이프라이닝
연속되었다는 것은 어떠한 것을 의미하는가?
->. Stream(). filter() 이러한 연속적인 처리를 연속되었다고 말하는 것인가?
연속되었다 : 순차적으로 값에 접근한다는 것을 의미한다.
컬렉션과 스트림의 차이
데이터를 언제 처리하느냐가 가장 큰 차이
- 컬렉션 - 모든 값을 메모리에 저장
- 스트림 - 요청이 왔을 때만 요소를 계산 (스트림에 요소를 추가 혹은 삭제는 불가)
탐색의 횟수
스트림은 요소를 탐색할 때 딱 한 번만 탐색한다. 그러므로 재 탐색을 할 때에는 또 다른 새로운 스트림을 만들어야 한다.
반복 처리 방법
- 컬렉션 - 사용자가 반복의 요소를 직접 제어
List<String> name = new ArrayList<>();
for(Dish dish : menu) {
name.add(dish.getName());
}
System.out.println(name);
- 스트림 - 어떠한 질의를 던질지만 정하고 이후의 과정은 스트림이 알아서 처리한다.
List<String> names = menu.stream()
.map(Dish::getName)
.collect(Collectors.toList());
System.out.println(names);
예시 코드
public class BookSeller {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Book> bookList = Arrays.asList(new Book("TOBY"),
new Book("OBJECT"),
new Book("RABBIT"),
new Book("TOBY"));
BookRepository book = (books) -> {
books.stream().forEach(f -> {
Stream.of(f.getName())
.distinct()
.forEach(System.out::println);
});
};
List<Book> name = bookList.stream()
.filter(m -> m.getName().equals("OBJECT"))
.collect(Collectors.toList());
List<Book> distinctName = bookList.stream()
.distinct()
.collect(Collectors.toList());
// System.out.println(book);
for(Book books : distinctName) {
System.out.println(books.toString());
}
}
}
https://seopsblog.blogspot.com/2016/05/java8.html
List<Dish> lowCaloricDishes = new ArrayList<>();
//칼로리가 400이 넘지 않는 것들을 lowCaloricDishes에 담는다.
for(Dish d: menu){
if(d.getCalories() < 400){
lowCaloricDishes.add(d);
}
}
//정렬
Collections.sort(lowCaloricDishes, new Comparator<Dish>(){
public int compare(Dish d1, Dish d2){
return Integer.compare(d1.getColories(), d2.getColories());
}
});
//정렬하면서 요리 이름 add
List<String> lowCaloricDishes = new ArrayList<>();
for(Dish d : lowCaloricDishes){
lowCaloricDishes.add(d.getName());
}
List<String> lowCaloricDishes =
menu.stream()
.filter(d->d.getColories() < 400)
.sorted(comparing(Dish::getColories))
.map(Dish::getName)
.collect(toList());
Code Link
https://github.com/mike6321/PURE_JAVA/tree/master/Java8/2Week/lamda
References
|
'Java > Java8' 카테고리의 다른 글
(JAVA8) 스트림의 활용 (2) (0) | 2020.01.19 |
---|---|
(JAVA8) 람다식 (2) (0) | 2020.01.19 |
(JAVA8) 람다식으로 향하는 과정 (0) | 2020.01.16 |
(JAVA8) 람다식 (1) (0) | 2020.01.03 |
(JAVA8) Java8 개요 (0) | 2019.11.11 |