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