본문 바로가기
Java/Java

[Java] Stream이란 ?

by 전재경 2022. 11. 20.

스트림(Stream)

 

기존 루프문 처리의 문제점

기존 Java에서 컬렉션 데이터를 처리할때는 for, foreach 루프문을 사용하면서 컬렉션 내의 요소들을

하나씩 다루었다. 간단한 처리나 컬렉션의 크기가 작으면 큰 문제가 아니지만 복잡한 처리가 필요하거나

컬렉션의 크기가 커지면 루프문의 사용은 성능저하를 일으키게 되었다.

 

스트림의 등장

스트림은 Java8에서 추가된 기능으로 컬렉션 데이터를 선언형으로 쉽게 처리할수 있다. 복잡한 루프문을

사용하지 않아도 되며 루프문을 중첩해서 사용해야 되는 최악의 경우도 더이상 없어졌다.

 

또한 스트림은 병렬처리(Multi thread)를 별도의 멀티스레드 구현없이도 쉽게 구현

 

스트림의 정의

 

데이터 처리연산을 지원하도록 소스에서 추출된 연속된 요소로 정의할 수있다.

 

 

 

// 기존 코드

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

 

김철수 10살.
이영희 11살.
박형준 13살.

 

// Stream 사용

public static void main(String args[]){
        
    List<Student> students = Arrays.asList( 
                new Student("김철수", 10),
                new Student("이영희", 11),
                new Student("박형준", 13)
            );
    
    for (Student student : students) {
        System.out.println(student.getName() + " " + student.getAge()+"살.");
    
    }
}

 

스트림 사용하기

스트림을 사용하기 위해서는 스트림 객체를 얻어야 합니다.

아래는 다양하게 스트림을 얻는 방법을 기술하였습니다.

 

컬렉션에서 얻기

List<String> texts = Arrays.asList("1","2");
Stream<String> stream = texts.stream();
Stream<String> parallelStream = texts.parallelStream();

배열에서 얻기

String[] texts = {"1","2"};
Stream<String> stream = Arrays.stream(texts);

숫자 범위로부터 스트림 얻기

IntStream intStream = IntStream.rangeClosed(1, 100);
LongStream longStream = LongStream.rangeClosed(1, 100);

디렉토리에서 스트림 얻기

Stream<Path> directory = Files.list( Paths.get("D:/over_the_dream/NaverCloud/3.Programming"));

파일로부터 스트림 얻기

Stream<String> file = Files.lines( Paths.get("D:/over_the_dream/NaverCloud/3.Programming/1.개발 요청 사항들.txt"),Charset.defaultCharset());

 

 

스트림 중간처리

스트림을 얻었다면 for문을 돌면서 중간 처리과정을 통해 데이터를 정제할 수 있습니다. 관련 method들.

distinct() : 중복 제거
filter(...) : 조건 필터링 , true를 만족하는 요소만 필터링한다.
flatMapXXX() : 스트림의 요소를 복수개의 구성요소로 대체하고 합쳐 새로운 스트림을 생성한다.
mapXXX() :  스트림의 요소를 새로운 구성요소로 대체하고 합쳐 새로운 스트림을 생성한다.
asXXXStream() : 형변환. 
boxed() : 기본 타입을 방싱타입으로 형변환
sorted(...) : 요소를 정렬하여 필터링
peak(...) : 요소 전체를 반복

 

스트림 최종처리

xxxMatch(...) : 스트림 요소 중 해당 조건에 만족하는 요소 여부를 boolean으로 반환합니다.
count() : 요소의 개수를 리턴
findFirst() : 첫번째 요소를 리턴 리턴 타입은 OptionalXXX
max( ... ) : 최대 요소를 리턴합니다. 리턴타입은 OptionalXXX
min(...) : 최소 요소를 리턴합니다. 리턴타입은 OptionalXXX
average() : 요소의 평균을 리턴합니다. 리턴타입은 OptionalDouble
sum() : 요소의 총 합을 리턴합니다. 리턴타입은 int, long, double
collect(...) : 최종 요소들을 Collection 객체로 담습니다.

 

 

참고 블로그 :

 

JAVA 스트림(Stream)

JAVA에서 말하는 Stream이 무엇인지 가볍게 살펴보겠습니다.

honbabzone.com

 

 

[Java] 스트림(Stream) 이란? 스트림과 컬렉션의 차이점 #내부반복 #외부반복

[Java8] 스트림 (Stream) 기존의 Java에서 컬렉션 데이터를 처리할때 특정 조건에 따라 필터링을 하려면 복잡한 과정을 거쳐야 했습니다. 반면에 SQL 문법의 경우 사용자가 원하는 조건의 데이터 목록

ksr930.tistory.com

 

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

[Java] 삼항 연산자  (0) 2022.11.20
[Java]StringBuilder 란 ?  (0) 2022.11.20
항해99 - Java 스터디 과제  (0) 2022.11.18
[Java]StringTokenizer 문자열 분리하기  (0) 2022.11.11
[Java]열거 타입  (0) 2022.11.11

댓글