❓stream이란
: Java8부터 지원하는 Stream은 컬렉션, 배열등에 저장되어있는 요소들을 하나씩 참조하며 반복적인 처리를 가능하게하는 기능
: stream을 이용하면 불필요한 for문과 그 안에서 이루어지는 if문등을 쓰지 않고도 깔끔하고 직관적인 코드 작성 가능
# stream 특징
1. stream은 데이터를 변경하지 않는다.
- stream은 원본데이터로부터 데이터를 읽기만 함
2. stream은 일회용이다.
- stream은 한 번 사용하면 닫혀서 재사용이 불가능하다. 필요하다면 정렬된 결과를 컬렉션이나 배열에 담아 반환할 수는 있음 ㅇㅇ
3. stream은 작업을 내부 반복으로 처리한다.
- stream을 이용한 작업이 간결할 수 있는 이유는 내부 반복이다. 내부 반복이라는 것은 반복문을 메서드의 내부에 숨길 수 있다는 것을 의미, 반복문이 코드 상에 노출되지 않음
# stream 구조
- 1. stream 생성
- 2. 중개 연산 : 연산결과를 stream형태로 반환 -> 연속적으로 연결해서 사용 가능
- 3. 최종 연산
데이터소스객체집합.stream생성().중개연산().최종연산();
String[] intArray = {"hello", "yellow", "green","hello world"};
Set<String> set = Arrays.asList(intArray) // intArray를 List로 변형
.stream()
.filter(e->e.stratsWith("hello")) // hello로 시작하는 단어
.collect(Collections.toSet()); // 중개연산을 통해 가공된 stream을 모아줌
set.forEach(e -> System.out.println(e));
1. stream 생성
- 컬렉션
- 배열
- 가변 매개변수
- 지정된 범위의 연속된 정수
- 특정 타입의 난수들
- 람다 표현식
- 파일
- 빈 스트림
ArrayList<Integer> list = new ArrayList<Integer>();
Stream<Integer> stream = list.stream();
stream.forEach(System.out.println); // forEach() 메소드를 이용해 스트림 요소의 순차 접근
1. 중개 연산
: Stream을 전달받아 Stream으로 반환하므로 중개 연산은 연속 사용 가능 ㅇㅇ
: Stream의 중개연산은 filter-map기반의 API를 사용함으로 lazy 연산을 통해 성능을 최적화 할 수 있음
중개 연산 메소드
1. stream 필터링 : filter(), distinct()
2. stream 변환 : map(), flatMap()
3. stream 제한 : limit(), skip()
4. stream 정렬 : sorted()
5. stream 연산 결과 확인 : peek()
// filter(), distinct()
IntStream stream1 = IntStream.of(7,5,5,2,1,2,3,5,4,6);
IntStream stream2 = IntStream.of(7,5,5,2,1,2,3,5,4,6);
// stream에서 중복된 요소 제거
stream1.distinct().forEach(e -> System.out.println(e + " "));
// 7 5 2 1 3 4 6
// stream에서 홀수만 찾아내기
stream2.filter(n -> n % 2 != 0).forEach(e -> System.out.println(e + " "));
// 7 5 5 1 3 5
// map(), flatMap()
Stream<String> stream = Stream.of("HTML", "CSS", "JAVA", "JAVASCRIPT");
stream.map(s -> s.toLowerCase()).forEach(System.out::println);
// 해당 스트림의 요소들을 주어진 함수에 파라미터로 전달하여, 그 반환값들로 이루어진 새로운 스트림 반환
// html css java javascript
String[] arr = {"study java", "i am hungry"};
Stream<String> stream = Arrays.stream(arr);
stream.flatMap(s -> Stream.of(s.split("+"))).forEach(System.out::println);
// 여러 문자열이 저장된 배열을 각 문자열에 포함된 단어로 이루어진 스트림으로 변환
// study java i am hungry
// limit(), skip()
IntStream stream1 = IntStream.range(0,10);
IntStream stream2 = IntStream.range(0,10);
IntStream stream3 = IntStream.range(0,10);
stream1.skip(4).forEach(e -> System.out.println(e + " "));
// 스트림의 첫번째 요소부터 전달된 개수만큼 요소를 제외한 나머지 요소만으로 이루어진 새로운 스트림
System.out.println(); // 4 5 6 7 8 9
+ 이어서 더 정리하기
출처
'뚝딱뚝딱 > Java' 카테고리의 다른 글
[Java] assertThat 비교 #JUnit #Assertj (0) | 2022.01.19 |
---|---|
[Java] Arrays.sort() 재정의하기 / Comparator 재정의 / 정렬 조건 바꾸기 (0) | 2022.01.19 |
[Java] interface, abstract 공부 (0) | 2022.01.18 |
[Java] 클래스 멤버, 인스턴스 멤버 (0) | 2022.01.18 |
[Java][오류] java.lang.NumberFormatException (0) | 2022.01.18 |