자바 - Stream의 생성

namkun·2022년 10월 3일
0

JAVA

목록 보기
10/20

Stream 생성

Stream api는 다음과 같이 다양한 데이터에서 생성할 수 있다.

컬렉션

자바에서 제공하는 컬렉션들의 조상격인 Collection 인터페이스에서는 stream() 메서드가 정의되어있다.

그렇기에, Collection 인터페이스를 구현한 모든 List, Set 컬렉션에서는 stream() 메서드로 스트림을 생성할 수 있다.

또한 parallelStream() 메서드를 사용하면 병렬 처리가 가능한 스트림을 생성할 수 있다.

List<String> list = new ArrayList<>();

list.add("hi");
list.add("ho");

// make stream from collection
Stream<String> stream = list.stream():

// forEach() 메서드를 사용해서 스트림의 요소에 순차적 접근
stream.forEach(System.out::println);

// result 
hi
ho

Stream 클래스의 forEach 메서느는 해당 스트림의 요소를 하나씩 소모하며 순차적으로 접근하는 메서드이다.
그렇기에 같은 스트림으로는 forEach로 한 번 밖에 호출할 수 밖에 없다.
그러나 원본 데이터의 소모를 말하는 것은 아니기에, 같은 데이터에서 다른 스트림을 생성하면 다시 접근할 수 있다.

배열

배열에 관한 스트림을 위해서 Arrays 클래스에는 다양한 형태의 stream() 메서드가 클래스 메서드로 정의되어 있다.

또한 기본 타입인 int, long, double 형을 저장할 수 있는 stream도 따로 별도로 정의되어 있다.(IntStream, LongStream, DoubleStream)

int [] arr = new Int[]{1, 2, 3, 4}

// 배열 스트림 생성
Arrays.stream(arr)
	.forEach(a -> System.out.print(a));

// result
1234

// 배열의 특정 부분만 가져오는 스트림 생성
Arrays.stream(arr, 1, 3)
	.forEach(a -> System.out.print(a));

// result
23

가변 매개변수

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

Stream.of(1, 2, 3, 4).
	.forEach(System.out::println);

// result
1
2
3
4

지정된 범위의 연속된 정수

지정된 범위의 연속된 정수를 스트림으로 생성하기 위해서 IntStream이나 LongStream 에 있는 range() 와 rangeClosed() 메서드가 정의되어 있다.

  • range() : 시작 정수를 명시적으로 포함하지만, 마지막 정수는 포함되지 않는 스트림을 생성한다.
  • rangeClosed() : 시작 정수와 마지막 정수 모두 명시적으로 포함하는 스트림을 생성한다.
IntStream.range(1, 4)
	.forEach(a -> System.out.print(a));

// result
123

IntStream.rangeClosed(1, 4)
	.forEach(a -> System.out.print(a));

//result
1234

특정 타입의 난수

특정 타입의 난수로 이루어진 스트림을 생성하기 위해서, Random 클래스에 ints(), longs(), doubles() 와 같은 메서드 들이 정의되어 있다.

이 메서드들은 매개변수로 스트림의 크기를 long 타입으로 전달받을 수 있다.

그러나 만약 매개변수를 전달받지 못하면 크기가 정해지지 않은 무한 스트림을 반환한다.

이때는 limit() 메서드를 사용하여 따로 스트림의 크기를 제한해야한다.

new Random().ints(4)
	.forEach(System.out::println);
    
 // result
 1072176871
-649065206
133298431
-616174137

람다 표현식

람다 표현식을 매개변수로 전달 받아서 해당 람다 표현식에 반환되는 값을 요소로 하는 무한 스트림을 생성하기 위해 Stream 클래스에는 iterate()와 generate() 메서드가 정의되어있다.

iterate() 메서드는 시드(seed)로 명시된 값을 람다 표현식에 사용하여 반환된 값을 다시 시드로 사용하는 방식으로 무한 스트림을 생성한다.

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

// result
2, 4, 6, 8, 10...

파일

파일의 행을 한 요소로 하는 스트림을 생성하기 위해서 java.nio.file.Files 클래스에 정의되어있는 lines() 메서드를 사용하면 된다.

또한, java.io.BufferedReader 클래스의 lines 메서드를 사용하면 파일뿐 아니라 다른 입력으로부터도 데이터 행 단위를 읽어올 수 있다.

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

빈 스트림

아무 요소도 가지지 않는 빈 스트림은 Stream 클래스의 empty() 메소드를 사용하여 생성할 수 있다.

System.out.printLn(Stream.empty()
	.count());
    
 // result
 0
profile
개발하는 중국학과 사람

0개의 댓글