java

stream API

주다애 2023. 7. 10. 19:47

본 게시물은 프로그래머스 FOO님의 실무 자바 개발을 위한 OOP와 핵심 디자인 패턴을 듣고 작성된 게시물입니다.

🌈 stream API

Java 8부터 도입된 기능으로, 컬렉션 데이터를 다루는데 강력한 도구이다.

for, if문을 대체할 수 있는 문법을 제공한다.

stream API는 Collection 인터페이스 내에 존재하는 메서드로, Collection 인터페이스를 구현하는 구현체에서 사용이 가능하다.

stream() 메서드를 호출하면 stream API 호출이 가능하다!

 

forEach

for문을 대체하는 반복을 위한 메서드

List<Integer> integerList = new ArrayList<>();

    integerList.add(10);
    integerList.add(20);
    integerList.add(30);
    integerList.add(40);
    integerList.add(50);
    integerList.add(60);
    integerList.add(70);

    integerList.stream().forEach(
            integer -> {
                System.out.println(integer);
            }
    );

    integerList.stream().forEach(
            integer -> {
                System.out.println(integer);

                if (integer.equals(40)) {
                    throw new RuntimeException();
                }
    });

for문과 다른 점은

1. break를 못 함. 예외를 던질 수 밖에 없음

2. 특정 요소에 접근할 수 없음

 

filter

조건에 맞는 요소만 뽑는 메서드

for문과 달리 미리 담을 변수를 선언해줄 필요가 없다.

List<Integer> integerList = new ArrayList<>();

    integerList.add(10);
    integerList.add(20);
    integerList.add(30);
    integerList.add(40);
    integerList.add(50);
    integerList.add(60);
    integerList.add(70);

    Integer findNum = integerList.stream().filter(
            integer -> {
                System.out.println(integer);

                if(integer.equals(40))
                    return true;
                return false;
            }
    ).findAny().get();

System.out.println("findNum = " + findNum);

> findNum을 미리 선언해줄 필요 없음

> 만약에 integerList에서 40이라는 원소를 찾으면 findNum값에 넣어준다.

findAny()는 조건을 만족하는 값을 한 개 찾으면 뒤의 값은 실행하지 않는 메서드이다.

즉, 위에서는 40을 찾았으니 50부터 70까지는 실행하지 않는다.

 

찾아보니,

findFirst() 메서드도 같은 기능이라고한다.

그럼 차이점은? stream을 병렬로 처리할 때!

findFirst()는 stream의 첫 번째 요소를 찾아서 반환

findAny()는 병렬 스레드에서 stream처리 시 가장 먼저 찾은 요소 반환.즉, 실행할 때마다 리턴 값 변경

 

map

원래의 컬렉션에 대해 특정 연산을 적용하여 새로운 컬렉션을 만들어내는 메서드

List<Integer> integerList = new ArrayList<>();

        integerList.add(10);
        integerList.add(20);
        integerList.add(30);
        integerList.add(40);
        integerList.add(50);
        integerList.add(60);
        integerList.add(70);

        List<Integer> x10IntegerList = integerList.stream()
                .map(integer -> integer * 10)
                .collect(Collectors.toList());

> .collect(Collectors.toList())를 통해 새로운 스트림을 List로 만든다.

 

map와 filter를 섞어서 사용하는 경우도 많다.

 

성능

그럼 stream의 성능은 for문과 비교하면 어떨까?

대체로 for문보다 느리다고 한다.

그럼 사용하지 말까? 그것도 아니다. 

개발 시에는 고려해야 하는 많은 사항이 있는데 그 중

가독성 측면에서 stream API를 사용하면 코드가 훨씬 간결해지고 직관적으로 변하기 때문에 장점이 된다고 한다.

 

매번 for문 쓰다가 이번 강의를 통해 stream을 알게 되었는데 알아 두면 좋을 것 같다.

(stream에 관련해선 다음 게시물에서 계속..)

'java' 카테고리의 다른 글

동일성 vs 동등성  (0) 2023.08.17
stream API + Optional  (0) 2023.07.15
람다식  (0) 2023.07.09
Optional  (0) 2023.07.09
상속  (0) 2023.07.08