JAVA - 람다와 스트림(6)

jodbsgh·2022년 4월 28일
0

💡"JAVA"

목록 보기
59/67

스트림(Stream)

  • 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것
List<Integer> list = Array.asList(1, 2, 3, 4, 5);

//스트림으로 변환하는 방법
Stream<Integer> inStream = list.stream();	//컬렉션
Stream<String> strStream = Stream.of(new String[] {"a", "b", "c"});	//배열
Stream<Integer> evenStream = Stream.iterate(0, n->n+2);	//0,2,4,6,...
Stream<Double> randomStream = Stream.generate(Math::random); //람다식
IntStream intStream = new Random().this(5);	//난수 스트림(크기가 5)
  • 스트림으로 작업하는 방법(순서)
  1. 스트림 만들기
  2. 중간연산
  3. 최종연산

스트림이 제공하는 기능 - 중간 연산과 최종 연산

  • 중간연산 : 연산 결과가 스트림인 연산. 반복적으로 적용 가능
  • 최종연산 : 연산결과가 스트림이 아닌 연산. 단 한번만 적용 가능(스트림의 요소를 소모)

stream.distinct().limit(5).sorted().forEach(System.out::println)

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)의 특징

  • 스트림은 데이터 소스로부터 데이터를 읽기만할 뿐 변경하지 않는다.
List<Integer> list = Arrays.asList(3,1,5,4,2);
List<Integer> sortedList = list.stream().sorted()
							.collect(Collectors.toList());
//list를 정렬해서 새로운 List에 저장

System.out.println(list);		//[3, 1, 5, 4, 2]
System.out.println(sortedList);	//[1, 2, 3, 4, 5]
  • 스트림은 Iterator처럼 일회용이다. (필요하면 다시 스트림을 생성해야 함)
strStream.forEach(System.out::println);	//모든 요소를 화면에 출력(최종연산)
int numOfStr = strStream.count();		//에러. 스트림이 이미 닫혔음.
  • 최종 연산 전까지 중간연산이 수행되지 않는다. - 지연된 연산
IntStream intStream = new Random().ints(1,46);		//1~45범위의 무한 스트림
intStream.distinct().limit(6).sorted()				//중간 연산
		  .forEach(i -> System.out.println(i+",");  //최종연산
  • 스트림은 작업을 내부 반복으로 처리한다.
for(String str : strList) System.out.println(str);
// 위 코드를 아래로 변경
Stream.forEach(System.out::println);
  • 스트림의 작업을 병렬로 처리 - 병렬 스트림
Stream<String> strStream = Stream.of("dd", "aaa", "CC", "cc", "b");
int sum = strStream.parallel()			     //병렬 스트림으로 전환(속성만 변경)
			.mapToInt(s -> s.length()).sum();//모든 문자열의 길이 합
  • 기본형 스트림 - IntStream, LongStream, DoubleStream
1. 오토박싱 & 언박싱의 비효율이 제거됨(Stream<Integer>대신 intStream사용)
2. 숫자와 관련된 유용한 메서드를 Stream<T>보다 더 많이 제공
profile
어제 보다는 내일을, 내일 보다는 오늘을 🚀

0개의 댓글