스트림 종류


자바 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));
    }
}