Java

JAVA8 Stream - 스트림 생성

Choi G.H 2021. 2. 26. 22:37
반응형

www.tcpschool.com/java/java_stream_concept

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

개요

 

스트림 API

 

기존에는 배열이나 컬렉션의 데이터에 접근하기 위해 반복문, 반복자를 사용하였다.

 

이러한 코드는 길이가 길고, 가독성이 떨어지며, 코드의 재사용이 용이하지 않다.

 

이를 해결하기 위해 JAVA SE 8부터는 스트림 API가 도입되었다.

 

스트림API는 추상적으로 데이터에 접근하며, 배열과 컬렉션 뿐만 아니라 파일에도 사용할 수 있다.

 

스트림 API의 특징:

1. 외부 반복을 통해 작업하는 컬렉션과 달리, 내부 반복(internal iteration)으로 작업을 수행한다.

2. 스트림은 재사용이 가능한 컬렉션과 달리 단 한번만 사용 가능하다.

3. 원본 데이터를 변경하지 않는다.

4. 필터-맵(filter-map) 기반의 API를 사용하여 지연연산을 통해 성능을 최적화한다.

5. parrarellStream() 메소드를 통한 손쉬운 병렬 처리를 지원한다.

 

스트림 API의 동작 흐름

스트림의 생성 →중개 연산→최종 연산

스트림의 생성

컬렉션

Collection 인터페이스에는 stream()메서드가 정의되어 있다. 

그래서 Collection 인터페이스를 implement한 모든 List, Set 컬렉션 클래스에서 stream()메소드로 스트림을 생성할 수 있다.

 

foreach를 사용한 기존의 코드와 stream을 사용한 코드

배열

 

가변 매개변수

Stream()클래스의 of() 메서드를 사용하면 가변 매개변수를 전달받아 스트림을 생성할 수 있다.

Stream<Double> stream = Stream.of(4.2, 2.5 1.9, 3.1);
stream.forEach(System.out::println);

지정된 범위의 연속된 정수

range() 메서드는 시작 정수를 포함하고 마지막 정수는 포함하는 스트림을 생성한다.

rangeClosed()메서드는 시작정수와 마자막 정수를 포함하는 스트림을 생성한다.

InputStream stream1 = IntStream.range(1,4);
stream1.forEach(e -> System.out.print(e + " "));
System.out.println();

IntStream stream2 = IntStream.rangeClosed(1,4);
stream2.forEach(e -> System.out.print(e + " "));
1 2 3
1 2 3 4

특정 타입의 난수들

ints(),longs(),doubles() 같은 메서드가 Random클래스에 정의되어 있다.

IntStream stream = new Random().ints(4);
stream.forEach(System.out::println);
1072176871
-649065206
133298431
-616174137

 

람다표현식

Stream stream = Stream.iterate(2, n -> n + 2);

파일

Stream<String> stream = Files.lines(path);

빈 스트림

Stream<Object> stream = Stream.empty();
System.out.println(stream.count()); //0

 

반응형