DIVE INTO JAVA - Stream

김종하·2020년 10월 1일
1

DiveIntoJAVA

목록 보기
2/11

Java 8 부터 추가된 Stream API 은 java collection 의 데이터들을 선언형으로 처리할 수 있게 해준다.
stream API 를 사용하면 연산을 연결해 복잡한 데이터 처리 파이프라인을 만들수 있고, 가독성 역시 뛰어나다. 그리고, 성능면에서도 데이터 처리과정을 병렬화 함으로써 얻는 이득을 취할 수 있게된다.

자주, 또 많이 사용하면서 Stream 사용을 자유자재로 할 수 있게끔, 많은 연습을 해야할 것 같다.

이어서 java 코드를 통해 Stream 을 익혀보자.

public class Main {
    public static void main(String args[]){

        List<FootballPlayer> playerList = new ArrayList<>();
        playerList.add(new FootballPlayer("son", 20));
        playerList.add(new FootballPlayer("messi", 15));
        playerList.add(new FootballPlayer("lingard", 1));
        playerList.add(new FootballPlayer("park",13));

        // 10골 이상 넣은 선수들의 리스트

        List<FootballPlayer> goodPlayerList = new ArrayList<>();

        // 기존에 사용하던 방법 
        
        for(FootballPlayer p : playerList){
            if(p.getNumberOfGoal() >= 10){
                goodPlayerList.add(p);
            }
        }

        goodPlayerList.forEach(p -> {
            System.out.println(p.name);
        });

        
        System.out.println("----------");
       
       // use Stream

        List<FootballPlayer> goodPlayerListUseStream = new ArrayList<>();

        goodPlayerListUseStream = playerList.stream()
                .filter(p -> p.getNumberOfGoal() >= 10)
                .collect(Collectors.toList());

        goodPlayerListUseStream.forEach(
                p -> System.out.println(p.name));


        System.out.println("----------");
        
        // Stream 을 사용하면, 위에서 말했듯이 복합적인 연산이 들어간 
        // 데이터 처리를 가독성 뛰어나게 할 수 있다. 
        // 10골이 넘는 선수들을 filter 해 골 순으로 sort 해보자. 

        List<FootballPlayer> sortedGoodPlayer = new ArrayList<>();

        sortedGoodPlayer = playerList.stream()
                .filter(p -> p.getNumberOfGoal() >= 10) // 10골 이상 넣은 선수들
                .sorted(Comparator.comparing(FootballPlayer::getNumberOfGoal).reversed()) // 골 수대로 DESC
                .collect(Collectors.toList());

        sortedGoodPlayer.forEach(p-> System.out.println(p.name + " " + p.numberOfGoal));


    }

    static class FootballPlayer{
        String name;
        int numberOfGoal;
        public FootballPlayer(String name, int numberOfGoal) {
            this.name = name;
            this.numberOfGoal = numberOfGoal;
        }

        public String getName() {
            return name;
        }
        public int getNumberOfGoal() {
            return numberOfGoal;
        }
    }
}

출력결과는 다음과 같다

son
messi
park
----------
son
messi
park
----------
son 20
messi 15
park 13

0개의 댓글