스트림

데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 추상화 함, 즉 배열이나 컬렉션뿐만 아니라 파일도 모두 같은 방식으로 다룰 수 있음

특징

1. 데이터 소스를 변경하지 않음

데이터를 읽기만 할 뿐 데이터 소스를 변경하지 않음

2. 일회용

한번 사용하면 닫혀서 다시 사용할 수 없음

3. 내부 반복으로 처리

스트림으로 작성한 코드가 간결할 수 있는 이유는 내부반복

class Stream {
    void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : src) {
            action.accept(t);
        }
    }
}

4. 연산

스트림은 마치 데이터베이스에 질의를 하는 것과 같은 느낌, 중간 연산과 최종 연산으로 분류할 수 있으며
중간 연산은 연속해서 연결할 수 있다. 반면 최종 연산은 한번만 가능하다.

  1. 지연된 연산, 최종 연산이 수행되기 전까지 중간 연산은 수행되지 않는다.

생성

컬랙션

컬랙션의 최고 조상인 Collection에 stream()이 정의 되어 있음, 그러므로 list, set의 구현체들은 모두 스트림을 생성할 수 있음

List<String> stringList = new ArrayList<>(Arrays.asList("김","은", "수", "김"));
Stream<String> listStream = stringList.stream();
listStream.forEach(System.out::println);

System.out.println();

Set<String> stringSet = new HashSet<>(Arrays.asList("김","은", "수", "김"));
Stream<String> setStream = stringSet.stream();
setStream.forEach(System.out::println);

배열

Stream과 Arrays에 정의되어 있음

Stream.of(T... values);
Stream.of(T[] t);
Arrays.stream(T[] t);
Arrays.stream(T[] t, int startIncluesive, int endExcluesive);
IntStream.of(int... values);
IntStream.of(int []);

특정 범위의 정수

IntStream.range(begin, end)

Intsream.rangeClosed(begin, end)

임의의 수

크기가 정해지지 않은 무한스트림이 생성되며 limit() 메서드를 사용해 제한해야함

IntStream randomIntStream = new Random().ints()

LongStream randomLongStream = new Random().longs()

IntStream randomIntStream = new Random().ints(5)

각 요소를 계산하여 스트림 생성

람다식에 의해 계산되는 값들을 무한스트림을 생성한다.

  • 첫번째 파라미터로 지정한 값부터 시작하여 f 함수로 의해 계산된 결과를 다시 seed 값으로 설정하고 계산을 반복하며 생성한다.

    Stream<T> iterate(T seed, UnaryOperator<T> f)

  • 파라미터가 없는 람다식을 이용해 계산되는 값을 이용하여 생성한다.

    Stream<T> generate(Supplier<T> s)

파일

java.nio.file.Files는 파일을 다루는데 유용한 메서드들을 제공, list()는 지정된 디렉토리에 있는 파일의 목록을 소스로하는
스트림을 리턴함

Stream<Path> pathStream = Files.list(Path dir)

파일 내용의 행을 요소로 하는 스트림

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

Stream<String> contentStream = lines(); // BufferedReader클래스

'Main > Java' 카테고리의 다른 글

[JAVA] Stream 중간연산  (0) 2021.03.30
[JAVA] 람다식 기본  (0) 2021.03.30
[JAVA] Stream skip(), limit() 사용법  (0) 2021.03.17
[JAVA] 리눅스 자바 한글 폰트 설정  (0) 2020.10.20
[JAVA] PNG 파일에 문자열 삽입하기  (2) 2020.10.14

+ Recent posts