스트림(stream)
-다양한 데이터소스를 표준화된 방법으로 다루기 위한것 ( 컬렉션 , 배열 등)
Stream은 Collection 의 진화형
List<Integer> list = Arrays.asList(1,2,3,4,5)
Stream<Integer> intStream = list.stream(); //컬렉션
//.stream() 메서드로 list를 stream 으로 만든다.
Stream<String> strStream = stream.of(new String[]{"a","b","c"}) // 매열
Stream<Integer> everStream = stream.iterate(0, n -> n+2);
Stream<Double> randomStream = stream.generate(Math::random);
IntStream intStream = new Random(),ints(5); //난수 스트림
스트림 사용하는 순서
1.stream만들기
2.중간연산 n번
3.최종연산(결과)
스트림이 제공하는 기능 - 중간연산 , 최종연산
중간연산 : 연산결과가 스트림인 연산 , 반복적으로 사용가능
최종연산 : 연산결과가 스트림이 아닌 연산 , 단 한번만 적용가능 (스트림 요소를 소모)
ex) stream.distinct().limit(5).sorted().forEach(systeam.out.println);
.distinct().limit(5).sorted() : 중간연산
.forEach(systeam.out.println); : 최종연산
//메소드 자체는 DB 용어와 비슷
String[] strArr = {"dd" , "aaa" , "CC" , "cc" , "b" };
Stream<String> stream = stream.of(strArr); //스트림만들기
Stream<String> filteredStream = stream.filter(); // 요소 걸러내기
Stream<String> distinctedStream = stream.distinct(); //중복 제거
Stream<String> sortedStream = stream.sort(); //정렬
Stream<String> limitedStream = stream.limit(5); //스트림 자르기
int total = stream.count(); //stream요소의 갯수 새기
스트림의 특징
1.스트림은 데이터소스로부터 데이터를 읽기만 할 뿐 변경하지 않는다.
List<Integer> list = Arrays.asList(3,1,5,4,2);
List<Integer> sortedList = list.stream().sorted().collec(collector.toList()); //정렬 후 새로운 List에 저장
*stream은 원본 데이터는 그대로 두고 새로운 결과값을 반환한다.
2.Stream는 Iterator처럼 일회용이다, (다시 필요하면 다시 스트림을 생성해야한다)
strStream.forEach(system.out.println); //모든 요소를 화면에 출력
int numOfstr = strStream.count(); // 위 연산에서 스트림을 다써버렷기 때문에 여기서 오류가 난다.
3.최종견산 전까지 중견연산이 수행되지 않는다 . -지연된 연산
IntStream intStream = new Random().ints(1,46);//1에서 46범위의 무한스트림
int Stream. intStream.distinct().limit(6).sotred()//중간연산 ,중복제거 , 잘라내기 , 정렬
.forEach(i -> system.out.println(i)); //최종연산 출력
4.Stream은 작업을 내부반복으로 처리한다
for(String str:strList) {
system.out.println(str)
}
위작업을 아래와 같이 처리
Stream.forEach(system.out.println())
5.스트림의 작업을 병렬로 처리 - 병렬스트림(멀티쓰레드)
Stream<String> strStream = stream.of("dd" , "aaa" , "cc" ,"CC" , "b");
int sum = strStream.parallel() // 병렬 스트림으로 전환(속성만 변경)
.mapToInt(s -> s.length()).sum(); //모든 문자열 길이의 합
기본형 스트림 IntStream , LongStream ,DoubleStream
오토박싱 , 언박싱의 비효율이 제거됨 (Stream <Integer> 대신 IntStream 사용)
숫자와 관련된 유효한 메서드를 Stream<T> 보다 더 많이 제공
미리 데이터 타입 제공 Stream을 사용 (기본형 데이터일 경우 한정)
'JAVA' 카테고리의 다른 글
스트림3 스트림의 최종연산 (0) | 2023.03.15 |
---|---|
스트림2 스트림의 중간연산 (0) | 2023.03.15 |
람다6 메소드 참조 (0) | 2023.03.15 |
람다5 함수 두개를 연결 andThan (0) | 2023.03.15 |
람다4 Predicate 람다 조건식 (0) | 2023.03.15 |