[Java] Stream 1 : 스트림 생성하기
요즘 스트림의 매력에 빠져서 스트림에 대해 공부하고 있다. 스트림에 대한 내용이 생각보다 많아서 글을 나눠서 1, 2, 3으로 정리해볼 생각이다.
Stream 1 : 스트림 생성하기 🚩현재 위치
Stream 2 : 스트림 가공하기
Stream 3 : 스트림 결과 만들기
Stream 1 : 스트림 생성하기
비어있는 스트림
Stream<String> streamEmpty = Stream.empty();
배열 스트림
배열을 새로 생성하여 배열 스트림 생성하기
Stream<String> streamOfArray = Stream.of("a", "b", "c");
현재 있는 배열을 사용해 스트림 생성하기 👉 Arrays.stream 메서드를 사용
//배열
String[] arr = new String[]{"a", "b", "c"};
//배열 스트림 생성
Stream<String> stream = Arrays.stream(arr);
//배열 일부만 사용해 배열 스트림 생성
Stream<String> streamOfArrayPart = Arrays.stream(arr, 1, 3); // arr에서 index 1-2만 가져옴 [b, c]
컬렉션 스트림
컬렉션은 스트림 메서드가 존재하기 때문에 그걸 이용해 만들어주면 된다.
//List 컬렉션 생성
Collection<String> collection = Arrays.asList("a", "b", "c");
//컬렉션 스트림 생성
Stream<String> streamOfCollection = collection.stream();
기본형 스트림
기본형 변수는 컬렉션에 담아서 스트림으로 처리 할 수도 있지만, 직접 기본형 스트림으로 생성도 가능하다.
IntStream intStream = IntStream.range(1, 3); // [1 2]
LongStream longStream = LongStream.rangeClosed(1, 3); // [1 2 3]
range는 마지막인자(여기선 3) 전 값까지 담고, rangeClosed는 마지막인자 값까지 담는다.
문자열 스트림
문자열을 스트림으로 만들 수도 있다.
lines를 활용하면 문자열 그대로 문자열 스트림으로 만들 수 있다. (요소가 나누어져있지 않음. 한 개의 요소)
Stream<String> name = "ggumi, mochi, dangi".lines(); // [ggumi, mochi, dangi] 하나의 요소
문자열을 나누어서 여러개의 요소로 문자열 스트림에 담고 싶다면, 아래의 코드처럼 하면 된다.
아래의 코드는 문자열을 정규식 표현을 이용해 "," 을 기준으로 나누어 문자열 스트림의 요소로 설정하고 있다.
Stream<String> streamOfString =
Pattern.compile(", ").splitAsStream("ggumi, mochi, dangi"); //[ggumi mochi dangi] 3개의 요소
문자열을 문자로 나누어서 기본형 스트림으로 바꾸는 것도 가능하다. chars() 는 문자열을 구성하고 있는 문자들의 ASCII 코드값을 스트림 형태로 바꾸어준다.
IntStream streamOfChars = "abc".chars(); // [97 98 99]
파일 스트림
파일도 한 줄씩 읽어와 문자열 스트림으로 생성해줄 수 있다.
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
//파일 읽어옴
Path path = Paths.get("C:\\file.txt");
//한 줄씩 문자열 스트림으로 생성
Stream<String> streamOfStrings = Files.lines(path);
//한 줄씩 문자열 스트림으로 생성 (UTF-8로 인코딩)
Stream<String> streamWithCharset =
Files.lines(path, Charset.forName("UTF-8"));
스트림 메서드를 사용해 스트림 생성하기
Stream.builder()
builder()를 사용해 스트림에 원하는 값을 직접 넣어 스트림을 생성할 수도 있다.
Stream<String> streamBuilder =
Stream.<String>builder().add("a").add("b").add("c").build(); //[a b c]
Stream.generate()
generate()를 사용해 스트림을 만들 수 있는데 생성되는 크기가 무한이기때문에 limit로 스트림 크기를 제한하여 사용하여야한다.
Stream<String> streamGenerated =
Stream.generate(() -> "ggumi").limit(5); [ggumi ggumi ggumi ggumi ggumi]
Stream.iterate()
iterate(초기값, 람다식) 으로 값을 지정하여 스트림을 생성해줄 수 있다. iterate()를 사용하여 스트림을 생성하면 역시 무한대 크기의 스트림이 생성되므로 limit로 크기를 제한해주어야한다.
아래의 코드에서는 40이 초기값이고, 2씩 증가하는 람다식을 사용하여 스트림을 생성하였다.
Stream<Integer> streamIterated = Stream.iterate(40, n -> n + 2).limit(5); //[40 42 44 46 48]
참고자료
https://www.baeldung.com/java-8-streams
The Java 8 Stream API Tutorial | Baeldung
The article is an example-heavy introduction of the possibilities and operations offered by the Java 8 Stream API.
www.baeldung.com