stream 문법

public class Main {
    public static void main(String[] args) {
        List list = new ArrayList<String>();
        
        list.add("public");
        list.add("static");
        list.add("void");
        
        //for 문으로 List를 순회할 수 있다.
        for (int i = 0; i < list.size(); i++) { // list.size()는 리스트의 크기를 반환한다.
            System.out.println(list.get(i)); // i번째 요소가 출력된다.
        }
        
        list.stream().forEach(str -> System.out.println(str));
    }
}
public class Main {
    public static void main(String[] args) {
        Integer[] integerArray = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        List<Integer> list = Arrays.asList(integerArray);
        
        /*
        int[] intArray = {1,2,3,4,5,6,7,8,9,10};
        List<Integer> list = Arrays.stream(intArray).boxed()
                                .collect(Collectors.toList());
        */
        
        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.get(i));
        }
        
        List evenList = list.stream()
                    .filter(value -> value %2 == 0).collect(Collectors.toList());
                
        evenList.stream().forEach(str -> System.out.println(str));
    }
}
  • filter() 메서드는 컬렉션의 요소들 중 조건문에 맞는 요소만 뽑아 새로운 스트림을 만든다. collect() 메서드와 함께 사용하면 전체 리스트 요소 중 조건문을 만족하는 요소를 뽑아 새로운 리스트를 만들 수 있다.

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

public class Main {
    public static void main(String[] args) {
        Integer[] integerArray = new Integer[] {1, 1, 1, 1, 2, 2, 2, 3, 3, 4};
        List<Integer> list = Arrays.asList(integerArray);
        List<Integer> distinctList = list.stream().distinct().toList();
        distinctList.stream().forEach(value -> System.out.println(value);
    }
}

map() 메서드는 컬렉션의 요소들에 특정 연산을 적용한 새로운 스트림을 만든다. 이때 입력으로 들어간 컬렉션의 수와 출력으로 나오는 컬렉션의 수는 동일하다. 예를 들어 문자열 컬렉션의 모든 소문자 요소들을 대문자로 바꾸는 새로운 컬렉션은 다음과 같이 만들 수 있다.

public class Main {
    public static void main(String[] args) {
        String[] lowercaseArray = new String[]("public",static","void");
        List<String> lowercaseList = Arrays.asList(lowercaseArray);
        List<String> uppercaseList = lowercaseList.stream()
            .map(value -> value.toUpperCase()).toList();
        uppercaseList.stream().forEach(value -> System.out.println(value));
    }
}

collect() / toList()

  • filter(), distinct(), map()과 함께 .collect(Collectors.toList()) 형태로 사용하면 스트림을 간단하게 리스트로 만들 수 있다. 이렇게 리스트로 바꾸는 경우가 아주 많기 때문에 자바 16 버전부터는 .collect(Collectors.toList()) 대신 toList()를 사용해 간결하게 코드를 작성하는 것이 가능해졌다. 이후 실습부터는 .collect(Collectors.toList()) 대신 toList()로 간결하게 작성한다.

Optional은 널(null)이 들어 있는 레퍼런스 변수의 멤버(필드나 메서드)에 접근하려고 할 때 발생하는 예외인 NullPointerException을 우아하게 해결하기 위해 등장했다.

public class Main {
    private static String getSomeString() {
        return null;
    }
    
    public static void main(String[] args) {
        String isThisNull = getSomeString();
        
        if(null != isThisNull) {
            System.out.println(isThisNull.toUpperCase());
        }
    }
}
public class Main {
    private static String getSomeString() {
        return Optiona.ofNullable("public static void");
    }
    
    public static void main(String[] args) {
            Optional<String> str = getSomeString();
            
            str.ifPresent((string) -> System.out.println(string.toUpperCase()));
        }
    }
}

Last updated