[Java] Stream API - 1

노홍기·2023년 4월 23일
0

Stream API

Stream의 정의

  • Stream API는 Lambda Expression을 이용한 기술 중 하나로 데이터 소스를 조작 및 가공, 변환하여 원하는 값으로 반환해주는 interface 입니다.
  • 해당 기능을 사용하기 위해서는 Java 1.8 이상의 버전을 사용해야 합니다.
  • 해당 Stream interface는 java.util.stream에 포함되어 있습니다.

Stream 타입 별 객체의 종류

분류타입Stream Type
정수형byteStream<Byte>
정수형shortStream<Short>
정수형intIntStream
정수형longLongStream
문자형charStream
실수형floatStream<Float>
실수형doubleDoubleStraem
문자열StringStream<String>
논리형booleanStream<Boolean>

Stream의 특징

1. 원본 데이터를 변경하지 않습니다.

  • Stream API는 원본 데이터를 조회하여 별도의 Stream 객체로 생성합니다.
  • 그렇기에 배열의 정렬이나 필터링 작엄을 하더라도 원본 데이터를 변경하지 않습니다.

2. 재사용이 불가능하여 일회용으로 사용됩니다.

  • Stream API는 이미 사용이 되어 닫혔다면 재사용이 불가능합니다.

3. 내부 반복으로 작업을 처리합니다.

  • Stream 내에서 내부적으로 반복문을 처리하기에 간결한 소스코드의 작성이 가능합니다.

Stream의 과정

  • Stream 객체를 구성하고자 할때에 "Stream 생성 -> 중간 연산 -> 최종 연산"의 세 단계의 과정을 통해 처리가 이루어 집니다.
Object.Stream().middle().final()

1. Stream 생성

분류상세 분류
Stream 생성empty stream
Stream 생성Collection
Stream 생성Array
Stream 생성Stream.builder()
Stream 생성Stream.generate()
Stream 생성Stream.Iterator()
Stream 생성기본 타입 스트림
Stream 생성파일 스트림

2. 중간연산

분류상세 분류
Stream 필터filter(), distinct()
Stream 변환map(), flatMap()
Stream 제한limit(), skip()
Stream 정렬sorted()
Stream 연산 결과 확인peek()

3. 최종연산

분류상세 분류
요소의 출력forEach()
요소의 검색findFirst(), findAny()
요소의 검사anyMatch(), allMatch(), noneMatch()
요소의 통계count(), min(), max()
요소의 연산sum(), average()
요소의 수집collect()

Stream - 생성

// 요소 값이 존재하지 않는 빈 스트림 객체를 생성
Stream<Object> emptyStream = Stream.empty();

// 컬렉션 값이 존재하는 스트림 객체 생성
List<String> strList = new ArrayList<>(Arrays.asList("a","b","c","d"));
Stream<String> strStream = strList.stream();

// 배열 값이 존재하는 스트림 객체를 생성
String[] strArr = {"a", "b", "c", "d"};
Stream<String> strStream2 = Arrays.stream(strArr);

Stream<String> strStream3 = Stream.of(strArr);

Stream<String> strStream4 = Stream.of("one", "two", "three");

// 빌더로 구성한 요소값들로 스트림 객체를 구성할 때
Stream<String> builderStream = Stream.<String>builder()
	.add("a")
    .add("b")
    .add("c")
    .add("d")
    .build();
    
// generate() 함수내에서 람다(Lambda)로 값을 지정하여 스트림을 구성할 때 사용
// 해당 스트림은 제한을 두지 않으면 무한으로 생성되기에 최대 크기를 지정해야합니다.
Stream<String> generatedStream = Stream.generate(() -> "abcd").limit(3); // ["abcd","abcd","abcd",]

// iterate() 함수 내에서 람다(Lambda)로 값을 지정하여 스트림을 구성할 때 사용
Stream<Integer> iteratedStream = Stream.iterate(70, (n) -> n + 10).limit(3) // [70, 80, 90]

// 기본타입(int, long, double)으로 값을 지정하여 스트림을 구성할 때 사용
IntStream intStream = IntStream.range(1,5);
LongStream longStream = LongStream.rangeClosed(1,5);
DoubleStream doubleStream = DoubleStream.iterate(100, (n) -> n+10).limit(3);

// 파일 타입(File)을 요소값으로 지정하여 스트림을 구성할 때 사용
Stream<String> fileToStrStream = Files.lines(Paths.get("file.txt"), Charset.forName("UTF-8"));

참고자료

profile
레벨업 하는 중

0개의 댓글