본문 바로가기
Programming

자바 스트림이란 What is Stream in JAVA ?

by 하하호호 2022. 4. 4.
반응형

 

자바 스트림이란 What is Stream in JAVA?


스트림(Stream) 개념

스트림(Stream)은 JAVA 8부터 추가된 기능이다. 컬렉션의 요소를 Iterator를 사용하지 않고 람다식으로 순회하면서 출력 가능한 기능을 제공한다. 람다식을 사용하기 때문에 코드가 훨씬 간결하고 반복자를 사용한 순회방법을 사용하여, 코드 자체의 양을 획기적으로 줄일 수 있는 방법이다. 

 

스트림은 말 그대로 데이터의 흐름이다. 스트림을 통해 배열과 컬렉션의 함수를 조합해서 필터링된 결과값을 얻을 수 있다. 스트림의 또 하나의 장점은 병렬처리가 가능하다는 점이다. 하나의 로직을 잘게 쪼개어 여러개의 작업을 동시에 진행할 수 있다. 

 

스트림이 나오기 전까지 JAVA 6에서는 ArrayList에 담긴 요소를 추출하기 위해서는 반복자 Iterator를 사용했어야 했다. 이것도 적응되면 그렇게 불편한 방법은 아니지만, 더 쉬운 방법이 있는데 Iterator을 계속 사용할 필요는 없다.

    public static void main(String[] args){
        // ArrayList 생성
        ArrayList<Integer> list = new ArrayList<Integer>();     
        // ArrayList 요소 추가
        list.add(1);
        list.add(2);
        list.add(3);
        // Iterator 생성
        Iterator<Integer> iter = list.iterator();
        // ArrayList 요소 출력
        while(iter.hasNext()){
            System.out.println(iter.next());
        }
    }
}

 

스트림(Stream) 개념

JAVA 8에서 추가된 스트림을 사용하면 훨씬 간단하다. Iterator로 작성된 코드들이 스트림으로 대체되고 있는 이유다. ArrayList의 stream() 메소드를 사용해서 Stream 오브젝트를 생성한 후 forEach() 순회문에서 람다식을 이용한다. 한줄로 순회문이 완성된다. ArrayList에 들어있는 요소들을 'num'으로 추출한 후 람다식을 이용하면 끝이다.

public static void main(String[] args){
    ArrayList<Integer> list = new ArrayList<>();     
    list.add(1);
    list.add(2);
    list.add(3);
    Stream<Integer> stream = list.stream();
    stream.forEach(num -> System.out.println(num));
}

 

스트림(Stream) 개념

스트림을 ArrayList 뿐만 아니라 배열에서도 사용이 가능하다. Arrays 클래스의 stream() 메소드를 이용해서 스트림 객체를 생성한 후 람다식을 이용한 forEach() 함수로 순회를 간단하게 구현할 수 있다. stream() 함수는 리턴값으로 Stream 인스턴스를 반환하게 되어 있다. 

public static void main(String[] args){
    String[] strArr = {"Canada", "USA", "Russia"};
    // Arrays의 stream() 함수 이용
    Stream<String> streamStr = Arrays.stream(strArr);
    streamStr.forEach(temp -> System.out.println(temp+"\n"));
}

 

스트림(Stream) 개념

String이나 Int 뿐만 아니라 클래스 배열에서도 Stream을 유용하게 사용할 수 있다. 클래스를 담은 ArrayList를 생성한 후 stream() 메소드로 Stream 오브젝트를 생성한다. 이후 람다식을 이용한 forEach() 함수로 간단하게 클래스 내의 ID값과 Name을 순회 추출할 수 있다.

static class Person{
        private int id;
        private String name;

        public Person(int id, String name){
            this.id = id;
            this.name = name;
        }
        public int getId(){
            return id;
        }
        public String getName(){
            return name;
        }
    }
public static void main(String[] args){
        ArrayList<Person> personList = new ArrayList<>();
        personList.add(new Person(1,"Jacob"));
        personList.add(new Person(1,"Mark"));
        personList.add(new Person(1,"Letto"));

        Stream<Person> personStream = personList.stream();
        personStream.forEach(temp -> System.out.println("ID : "+temp.id+" Name : "+temp.name+"\n"));



    }

 

 

Java Stream.builder()

배열과 ArrayList를 Stream으로 변환해서 사용할 뿐만 아니라 Stream에 직접적으로 데이터를 추가하여 반복자로 추출할 데이터를 구축할 수 있다. <데이터타입>.builder() 함수로 Stream Build를 시작하고 데이터를 추가한 후 마지막에 build()를 통해 stream 오브젝트를 리턴하게 된다.

public static void main(String[] args){
    Stream<Integer> stream =
            Stream.<Integer>builder().add(1).add(2).add(3).build();

    stream.forEach(num -> System.out.println(num));
}

 

Java Stream.generate() 

Stream.generate()을 이용해서 동일한 데이터를 한번에 Stream으로 생성할 수 있다. Stream.generate() 함수로 생성되는 Stream의 경우 길이의 제한이 없는 데이터 흐름이기 때문에 limit() 함수로 Stream의 길이를 따로 지정해줘야 한다.

public static void main(String[] args){
    Stream<Integer> stream = Stream.generate(() -> 100).limit(3);
    stream.forEach(temp -> System.out.println(temp));
}

 

더 많은 콘텐츠

 

 

자바 JAVA 제네릭 Generic이란?

자바(JAVA) 제네릭(Generic)이란? 자바(JAVA)에서 제네릭(Generic)이란 데이터 형식에 의존하지 않으면서, 다른 데이터 타입들로 사용할 수 있는 방법이다. 클래스 내부에서 데이터 타입을 지정하는것이

incomeplus.tistory.com

 

반응형

댓글