👩‍💻 BackEnd/☕️ 자바 [Java]

[Java] 자바 8 버전 이상의 자바문법 : 스트림 API

minhe2810 2024. 2. 26. 00:43
✅ ** 해당 내용은 '이것이 취업을 위한 백엔드 개발이다' 책을 보며 개인공부 목적으로 정리한 내용입니다! **

 

스트림 API 

컬렉션에 추가된 메서드의 집합을 의미 

컬렉션에 담긴 데이터를 처리하는 존재라는 것을 명심! 

 

forEach()

: 컬렉션의 요소들을 하나씩 꺼내서 반복하므로 문법적으로 보면 반복문을 쉽게 대처할 수 있다. 

public class Lambda {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("public");
        list.add("static");
        list.add("void");

        // for 문으로 List 를 순회할 수 있다.
        for (int i = 0; i < list.size(); i++) {
            System.out.println("list = " + list.get(i)); // i번째 요소가 출력된다.
        }

        list.stream().forEach(str -> System.out.println("str = " + str));
    }

}

 

 

 

filter()

: 컬렉션의 요소들 중 조건문에 맞는 요소만 뽑아 새로운 스트림을 만든다.

collect() 메서드와 함께 사용하면 전체 리스트 요소 중 조건문을 만족하는 요소를 뽑아 새로운 리스트를 만들 수 있다.

package pkg2;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Lambda2 {
    public static void main(String[] args) {
        Integer[] integers = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        List<Integer> list = Arrays.asList(integers);

//        List evenList = new ArrayList<Integer>();

//        for (int i = 0; i < list.size() ; i++) {
//            Integer number = list.get(i);
//            if (number % 2 == 0) {
//                evenList.add(number);
//            }
//        }
//
//        for (int i = 0; i < evenList.size(); i++) {
//            System.out.println("evenList = " + evenList.get(i));
//        }



        List evenList = list.stream()
                .filter(value-> value % 2 == 0).collect(Collectors.toList());

        evenList.stream().forEach(value -> System.out.println("value = " + value));


    }
}

 

 

distinct()

: 컬렉션의 요소에서 중복을 제거한다. 

중복을 제거한다는 행위가 이미 정해져있기 때문에 람다 표현식을 함수의 인자로 넘겨줄 필요가 없고, 이때 중복인지 아닌지를 판단하는 것은 요소들의 equals() 메서드이다. 

public class Lambda3 {
    public static void main(String[] args) {
        Integer[] integers = new Integer[]{1, 2, 3, 4, 5};
        List<Integer> list = Arrays.asList(integers);

        list.stream()
                .forEach(val -> System.out.println(val));
        
        // filter() : 컬렉션의 요소들 중 조건문에 맞는 요소만 뽑아 새로운 스트림을 만든다. 
        List evenList = list.stream()
                .filter(val -> val % 2 ==0).collect(Collectors.toList());
        evenList.stream().forEach(val -> System.out.println("even val = " + val));

        System.out.println("----------------------");

        // distinct() : 컬렉션의 요소에서 중복을 제거한다. 중복을 제거한다는 행위가 이미 정해져있기 때문에 람다 표현식을 함수의 인자로 넘겨줄 필요가 없고, 이때 중복인지 아닌지를 판단하는 것은 요소들의 equals() 메서드이다.
        List<Integer> distinctList = list.stream().distinct().collect(Collectors.toList());
        distinctList.stream().forEach(val -> System.out.println("distinct val = " + val));

    }
}

 

 

map() 

컬렉션의 요소들에 특정 연산을 적용한 새로운 스트림을 만든다. 이때 입력으로 들어간 컬렉션의 수와 출력으로 나오는 컬렉션의 수는 동일하다. 

package pkg2;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Lambda4 {
    public static void main(String[] args) {
        String[] lowercaseArray = new String[]{"public", "static", "void"};
        List<String> lowercaseList = Arrays.asList(lowercaseArray);

        // map() : 컬렉션의 요소들에 특정 연산을 적용한 새로운 스트림을 만든다.
        // 이때 입력으로 들어간 컬렉션의 수와 출력으로 나오는 컬렉션의 수는 동일하다.
        // 예를 들어 문자열 컬렉션의 모든 소문자 요소들을 대문자로 바꾸는 새로운 컬렉션은 다음과 같이 만들 수 있다.
        List<String> uppercaseList = lowercaseList.stream()
                .map(val -> val.toUpperCase()).collect(Collectors.toList());

        uppercaseList.stream().forEach(val-> System.out.println("val = " + val));

        // collect(Collect.toList()) : 스트림을 간단하게 리스트로 만들 수 있다. 이렇게 리스트로 바꾸는 경우가 아주 많기 때문에 자바 16버전 부터는 .collect(Collect.toList()) 대신 .toList() 를 사용해 간결하게 코드를 작성하는 것이 가능해졌다.

    }
}

 

collect() / toList() 

filter(), distinct(), map() 과 함께 .collect(Collectors.toList()) 형태로 사용하면 스트림을 간단하게 리스트로 만들 수 있다. 

이렇게 리스트로 바꾸는 경우가 아주 많아서 자바 16 버전 부터는 toList() 를 사용해 간결하게 코드를 작성하는게 가능해졌다고 한다.