스트림 종류
자바 8 부터 새로 추가된 java.util.stream
패키지에는 스트림(stream) API들이 포진하고 있다. 패키지 내용을 보면 BaseStream 인터페이스를 부모로 해서 자식 인터페이스들이 다음과 같은 상속 관계를 이루고 있다.
BaseStream
인터페이스에는 모든 스트림에서 사용할 수 있는 공통 메소드들이 정의되어 있을 뿐 코드에서 직접적으로 사용되지는 않는다. 하위 스트림인 Stream
, IntStream
, LongStream
, DoubleStream
이 직접적으로 이용되는 스트림인데, Stream 은 객체 요소를 처리하는 스트림이고, IntStream, LongStream, DoubleStream 은 각각 기본 타입인 int, long, double 요소를 처리하는 스트림이다. 이 스트림 인터페이스의 구현 객체는 다양한 소스로부터 얻을 수 있다. 주로 컬렉션과 배열에서 얻지만, 다음과 같은 소스로부터 스트림 구현 객체를 얻을 수 도 있다.
리턴 타입 | 메소드(매개 변수) | 소스 | |
---|---|---|---|
Stream <T> | java.util.Collections.Stream() java.util.Collection.parallelStream() |
컬렉션 | |
Stream <T> IntStream LongStream DoubleStream |
Arrays.stream(T[]) Arrays.stream(int[]) Arrays.stream(long[]) Arrays.stream(double[]) |
Stream.of(T[]) IntStream.of(int[]) LongStream.of(long[]) DoubleStream.of(double[]) |
배열 |
IntStream | IntStream.range(int, int) IntStream.rangeClosed(int, int) |
int 범위 | |
LongStream | LongStream,range(long, long) LongStream.rangeClosed(long, long) |
long 범위 | |
Stream<Path> | Files.find(Path, int, BiPredicate, FileVisitOption) Files.list(Path) |
디렉토리 | |
Stream<String> | Files.lines(Path, Charset) BuufferedReader.lines() |
파일 | |
DoubleStream IntStream LongStream |
Random.doubles(...) Random.ints() Random.longs() |
랜덤 수 |
1. 컬렉션으로부터 스트림 얻기
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class FromCollectionExample {
public static void main(String[] args){
List<Student> studentList = Arrays.asList(
new Student("홍길동", 10),
new Student("고길동", 20),
new Student("김길동", 30)
);
Stream<Student> stream = studentList.stream();
stream.forEach(s -> System.our.println(s.getName()));
}
}
public class Student {
private String name;
private int score;
public Student (String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {return name};
public int getScore() {return score};
}
2. 배열로부터 스트림 얻기
import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class FromArrayExample {
public static void main(String[] args){
String[] strArray = {"홍길동", "고길동", "김길동"};
Stream<String> strStream = Arrays.stream(strArray);
strStream.forEach(a -> System.our.println(a + ","));
System.out.println();
int[] intArray = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(intArray);
intStream.forEach(a -> System.out.print(a + ","));
System.out.println();
}
}
3. 숫자 범위로부터 스트림 얻기
import java.util.stream.IntStream;
public class FromIntRangeExample {
public static int sum;
public static void main(String[] args){
// rangeClosed 는 첫 번째 매개값에서부터 두 번째 매개값까지 순차적으로 제공하는 IntSTream을 리턴한다.
IntStream intStream = IntStream.rangeClosed(1, 100);
intStream.forEach(a -> sum += a);
System.out.println("총합" + sum);
}
}
4. 파일로부터 스트림 얻기
import java.io.BufferReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class FromFileContentExample{
public static void main(String[] args) throws IOException{
Path path = Paths.get("src/.../a.txt");
Stream<String> stream;
//Files.lines() 메소드 사용
stream = Files.lines(path, Charset.defatulCharset()); // 운영체제 기본 문자 셋
stream.forEach(System.out :: println); // s -> System.out.println(s) 와 동일
System.out.println();
//BuuferedReader의 lines() 메소드 이용
File file = path.toFile();
FileReader fileReader = new FileReader(file);
BufferedReader br = new BufferedReader(fileReader);
stream = br.lines();
stream.forEach(System.out :: println);
}
}
5. 디렉토리로부터 스트림 얻기
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class FromDirectoryExample{
public static void main(String[] args) throws IOException{
Path path = Paths.get("src/.../");
Stream<String> stream = Files.list(path);
stream.forEach(p -> System.out.println(s.getFileName));
}
}