반복문을 대체 할 수 있는 기능
처음에는 정말 왜 사용해야 하는지 이해하지 못했다. 메서드들을 알고 있어야 코드의 이해가 가능하고, 성능 또한 for문 혹은 foreach문보다 좋지 않다. 하지만 로직이 복잡하면 for문안에 담는 것보다 훨씬 간결하게 작성할 수 있고, 유지보수가 수월하다. (그리고 쓰다보면 이어지는게 재밌다)
Obejct.스트림생성().중개연산().최종연산();
메서드들을 정리한 자료가 있는데, 진짜 너무 많다. 자주 사용하는 것들의 예시를 들어놓겠다.
public class Ball {
private int number;
public Ball(int number) {
this.number = number;
}
public void getNumber() {
return this.number;
}
//...
}
public class MapSample {
// 스트림을 이용한 메서드
public int sumAll(List<Ball> balls) {
return balls.stream()
.mapToInt(ball -> ball.getNumber())
.sum();
}
// for문을 이용한 메서드
public int sumAllByFor(List<Ball> balls) {
int sum = 0;
for (int i = 0; i < balls.size(); i++) {
sum += balls.get(i).getNumber();
}
return sum;
}
// iter을 이용한 메서드
public int sumAllByForEach(List<Ball> balls) {
int sum = 0;
for (Ball ball : balls) {
sum += ball.getNumber();
}
return sum;
}
}
public class FilterSample {
// 스트림을 이용한 메서드
public Ball findBall(List<Ball> balls, int number) {
return balls.stream()
.mapToInt(ball -> ball.getNumber())
.filter(ball -> ball.getNumber() == number)
.findFirst()
.orElseThrow(RuntimeException::new);
}
// for문을 이용한 메서드
public Ball findBallByFor(List<Ball> balls, int number) {
for (int i = 0; i < balls.size(); i++) {
if (balls.get(i).getNumber() == number) {
return balls.get(i);
}
}
throw new RuntimeException();
}
// iter을 이용한 메서드
public Ball findBallByForEach(List<Ball> balls, int number) {
for (Ball ball : balls) {
if (ball.getNumber() == number) {
return ball;
}
}
throw new RuntimeException();
}
}