본문 바로가기

Java/Java8

(JAVA8) 스트림의 개요 (1)

스트림을 왜 써야 하는가?

컬렉션을 대체해 보다 편한 작업을 수행할 수 있도록 도와주는 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

 

[JAVA8] 중복제거 하기

웹개발관련 블로그 입니다.

seopsblog.blogspot.com

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

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

References

자바 8 인 액션
국내도서
저자 : 라울-게이브리얼 우르마(RAOUL-GABRIEL URMA),마리오 푸스코(MARIO FUSCO),앨런 마이크로프트(ALAN MYCROFT) / 우정은역
출판 : 한빛미디어 2015.04.01
상세보기

'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