본문 바로가기

프로그래밍/자바

[자바/기본] Stream 이란?

728x90
반응형
SMALL

Stream 이란?

 

[자바/기본] 람다식 (Lambda) 란?

람다 표현식 Java8 부터 도입 추상메소드가 하나뿐인 인터페이스를 Override를 통해 구현 이를 함수형 인터페이스 (Functional Interface) 라고 부름 익명 클래스 (관련 설명은 여기에[내부 클래스]) 의 더

jk25.tistory.com

  • 본인은 InputStream, OutputStream 의 부모가 되는 객체로 예상 했었다.
    • 아니었다. 확실히 아니다
  • Collection, 배열 등의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있게 지원해준다.
    • EX) for문이나 forEach 등의 반복문 혹은 iterator 를 통해 각각의 원소에 접근해서 가공하는 방법을 Stream 객체로 감싸게 되면서 필요한 형태로 가공하여 반환 할 수 지원하는 것이다.
  • 일관성 있는 처리가 가능하다
    • EX) 배열.length 와 Collections.size() 는 같은 연산을 하지만 자료 대상마다 부르는 함수가 다른 불편함을 극복 할 수 있다.

Stream 생성

What To Know

  • Stream은 생성하면 Stream이 열리고 모든 연산을 행한 후에 결과를 받으면 닫히는 방식
  • 한번 닫힌 Stream은 다시 사용 할 수 없다.
  • stream(), of() 메소드를 사용해서 Collections, 배열 등 다양한 곳에서 생성이 가능
    • stream() 은 Collections<> 인터페이스의 기본 메소드로 정의 되어있다.
    • Stream.of() 를 통해 생성하는 것 또한 가능하다.
  • Stream<T> 처럼 Generic을 사용하지만 기본 자료형에 한해서 Int, Double, Long 이 3개의 스트림이 존재 한다.
    • IntStream
    • DoubleStream
    • LongStream
  • 이를 Boxed Stream, Primitive Stream 으로 나뉘어 부른다.
int [] intArr = {5, 2, 1, 4, 3};   // 배열
double [] doubleArr = {0.1, 0.2, 0.3, 0.4};
List<String> stringList = List.of("first", "second", "thrid");  // List<String>
List<Integer> intList = List.of(1, 2, 3, 4, 5);   // List<Integer>
Set<Integer> integerSet = Set.of(10, 20, 30);     // Set<Integer>
Map<String, Integer> person = Map.of("zayson", 28, "chaeyoung", 26);	//Map

// 기본 자료형 stream IntStream, DoubleStream
IntStream stream1 = Arrays.stream(intArr);
DoubleStream stream2 =  Arrays.stream(doubleArr);

// 컬렉션 의 스트림 생성
Stream<String> stringStream = stringList.stream();  // Collection 의 Stream 생성
Stream<Integer> intStream = intList.stream();

// toString()을 지원하지는 않음
System.out.println(stream1);  // java.util.stream.IntPipeline$Head@6d311334
System.out.println(stringStream);	// java.util.stream.ReferencePipeline$Head@372f7a8d

// Map 의 Entry 들의 Stream
Stream<Map.Entry<String, Integer>> entryStream = person.entrySet().stream();

// Set 의 Stream
Stream<Integer> stream = integerSet.stream();

// Stream.of() 팩토리 메서드로 스트림 생성
Stream<Integer> integerStream = Stream.of(20, 30);
Stream<Customer> customerStream = Stream.of(
    new Customer("Hey", 25),
    new Customer("Hi", 24)
);

 


Stream 연산

What To Know

  • Stream 연산은 기존 자료를 변경하지 않음
    • EX) Stream으로 감싼 배열의 원본 배열을 Stream연산에서 건들이지 않음
  • Stream 연산은 중간 연산과 최종 연산으로 구분 된다.
  • 중간 연산 
    • 어떤 조건으로 자료를 filtering 하거나, 앞서 말하는 조건에 맞는 자료를 꺼내오는 등의 중간 연산은 체이닝이 된다.
// map(), filter(), sorted(), distinct(),limit(), skip()
// peek(), boxed(),mapToInt(), mapToDouble(), mapToLong()
  • 최종 연산 (터미널 연산이라고도 함)
    • 결과를 출력 해야 한다.
      • EX) 합 또는 평균을 구하는 등의 연산
    • 최종 연산의 경우 자료를 소모 하면서 연산을 수행한다.
      • 따라서 맨 마지막에 등장 해야 하고, 최종 연산 후에는 Stream의 다른 연산은 적용 할 수 없다.
      • 만약, 중간 연산이 있을 때, 중간 연산을 다 적용해야 하기때문에 지연 연산 이 발생
// forEach()
// min(), max(), count(), sum(), average()
// reduce(a, b)
// anyMatch(), allMatch(), noneMatch(),
// findFirst(), findAny(),
// collecting()

728x90
반응형
LIST