Stream이란 collection 데이터를 처리하기 위해 사용하는 객채이다.Stream을 이용하면 간결하고 가독성이 있다.
Stream의 특징
Stream은 원본데이터를 변경하지 않는다.
Stream은 일회용이다, 한번 사용하고 나면 다시 사용할수 없어서 다시 사용하고 싶다면 다시 생성해야 한다.
스트림의 연산과 메서드
Stream에서 제공하는 연산을 통해 작업 처리가 가능하다.
Stream에 제공하는 연산은 중간연산과 최종연산으로 분류 할수 있다.
중간연산 : 반환값을 다른 중간연산에 반환이 가능하기 때문에 메서드 체어닝이 가능하다
최종연산 : 스트림의 요소를 소모하므로 단 한번만 가능하다
Stream선언
import java.util.ArrayList;
import java.util.stream.Stream;
public class streamex {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>(); //Collection 생성
list.add("A");
list.add("B");
list.add("C");
list.add("D");
Stream stream = list.stream();//생성 후 list에 붙임
}
중간연산
filter() : 조건에 맞지않는 요소를 걸러낸다.
distinct() : 중복 값을 제거 한다.
sort() : 스트림을 정렬할때 사용
map() : 원하는 값을 뽑아내거나 특정형태로 변환할때 사용
flatmap : 각 요소에 매핑 함수를 적용하고 새로운 스트림을 만들때 사용
import java.util.ArrayList;
import java.util.stream.Stream;
public class streamex {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("C");
list.add("B");
list.add("D");
list.add("C");
list.add("DD");
Stream stream = list.stream();
list.stream().distinct().forEach(System.out::println);
System.out.println();
list.stream().filter(x -> x.equals("D")).forEach(System.out::println);
System.out.println();
list.stream().sorted().forEach(System.out::println);
System.out.println();
list.stream().map(x->x.length()).forEach(System.out::println);
System.out.println();
}
}
최종 연산
forEach() : 각 요소에 대해 반복 수행 for문과 동일한
joining() : 모든 요소를 하나의 문자열로 연결해서 반환
sum() : 반환된 요소들의 합을 구한다
max() : 최대값을 구한다
min() : 최소값을 구한다
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
List<Book> bookList = Arrays.asList(
new Book(1L, "모두의 딥러닝", "조태호", "IT", 21600),
new Book(2L, "이득우의 게임 수학", "이득우", "IT", 40500),
new Book(3L, "자바 웹 개발 워크북", "구멍가게 코딩단", "IT", 31500),
new Book(4L, "실전 시계열 분석", "에일린 닐슨", "IT", 34200),
new Book(5L, "데이터 분석가의 숫자유감", "권정민", "IT", 14400),
new Book(6L, "스프링 부트 실전 활용 마스터", "그렉 턴키스트", "IT", 25200),
new Book(7L, "오늘부터 IT를 시작합니다", "고코더", "IT", 16200),
new Book(8L, "그림으로 이해하는 인지과학", "기타하라 요시노리", "IT", 16200),
new Book(9L, "괜찮아, 그 길 끝에 행복이 기다릴 거야", "손미나", "여행", 17100),
new Book(10L, "여행의 이유", "김영하", "여행", 12150),
new Book(11L, "여행의 시간", "김진애", "여행", 16200),
new Book(12L, "로봇 시대 살아남기", "염규현", "역사", 14850),
new Book(13L, "경제 전쟁의 흑역사", "이완배", "역사", 15750),
new Book(14L, "100가지 동물로 읽는 세계사", "사이먼 반즈", "역사", 29700),
new Book(15L, "k 배터리 레볼루션", "박순혁", "경제", 17100),
new Book(16L, "정하준의 경제학 레시피", "장하준", "경제", 16200),
new Book(17L, "레버리지", "롭 무어", "경제", 16200)
);
//카테고리가 여행인 책 제목 조회
//filter :
Stream<Book> bookStream1 = bookList.stream();
bookStream1.filter( book->book.getCategory().equals("여행")).forEach(list -> System.out.println(list.getBookName()));
// 가격이 16200원 이하인 책 제목 조회
Stream<Book> bookStream2 = bookList.stream();
bookStream2.filter(price -> price.getPrice()<=16200).forEach(price -> System.out.println(price.getBookName()+","+price.getPrice()));
//책 제목에 ""경제"" 라는 용어가 들어간 책 제목 조회하기
Stream<Book> bookStream3 = bookList.stream();
bookStream3.filter(name -> name.getBookName().contains("경제")).forEach(name -> System.out.println(name.getBookName()));
//가격이 가장 비싼 책 가격 조회하기
Stream<Book> bookStream4 = bookList.stream();
System.out.println(bookStream4.mapToDouble(max -> max.getPrice()).max().getAsDouble());
//카테고리가 IT인 책들의 가격 합 조회하기
Stream<Book> bookStream5 = bookList.stream();
System.out.println(bookStream5.filter(category -> category.getCategory().equals("IT")).mapToDouble(price -> price.getPrice()).sum());
//IT 책 할인 이벤트!
Stream<Book> bookStream6 = bookList.stream();
bookStream6.filter(category -> category.getCategory().equals("IT")).map(price -> {
price.setPrice(price.getPrice() * 0.6);
return price;
}).toList().forEach(result -> System.out.println(result.getBookName() + "," + result.getPrice()));
}
}