백앤드 개발일지/자바
[Java] 람다식과 스트림
giron
2022. 2. 17. 19:53
728x90
오랜만에 글을 작성하네요.. ㅎ🤣🤣
우테코 전에는 스프링으로 프로젝트를 하면서 필요한 자바 문법들을 찾아서 공부했다면, 우테코를 시작하면서는 자바 본연에 대해 공부를 하고 있는데요. 오늘은 java8 람다식과 스트림에 대해 알아보려고 합니다.
사실 자동차 경주 미션을 진행하면서 오랜만에 람다를 사용하면서 매번 찾아보면서 사용했던 람다를 한번 공부해보자는 생각으로 작성합니다.
람다식(Lambda Expression)🤡
문법
문법은 간단합니다. 코드를 보는게 이해가 더 빠를 것이라고 생각됩니다.
public int sum(int a, int b) {
return a + b;
}
//람다식 변환
(a, b) -> a + b;
장점
- 매우 깔끔하고 알아보기도 쉽다.
- 동작을 사용하기 위해서 클래스를 정의할 필요도 없다.
- 메소드의 리턴 타입도 없고, 메서드의 이름도 없다.
- 람다와 함께 사용할 수 있다.
매소드 이름없이 작성할 수 있기 때문에 익명 함수(Anonymous Function)라고도 불립니다. 메서드의 이름도 리턴 타입도 없지만 뭐하는 식인지는 쉽게 알 수 있다는 장점 덕분에 java8부터 추가된 것이라고 생각됩니다.
스트림(Stream) API👀
자바 8 이후부터 추가된 stream은 for문을 사용한 반복문이 갖는 단점들을 해결해줄 수 있다. for문이 갖는 단점으로는 쉽게 indent가 증가하고 if문 같은 분기문이 쉽게 발생한다는 점이다.
문법
stream().중개연산.단말연산
문법은 아래의 코드처럼 stream() 생성을 하고 중개 연산 결과들을 계속 반환하면서 이어가다 단말 연산을 이용해 멈춘다.
ArrayList<RacingCar> winners = new ArrayList<>();
for (RacingCar racingCar : racingCars) {
if (racingCar.isSamePosition(racingCarOfMaxPosition)) {
winners.add(racingCar);
}
}
return winners;
// stream api를 활용한 식
private final List<RacingCar> racingCars = new ArrayList<>();
return racingCars.stream()
.filter(racingCar -> racingCar.isSamePosition(racingCarOfMaxPosition))
.collect(Collectors.toCollection(ArrayList::new));
장점
- 위 코드만 봐도 알듯이 코드의 길이가 확연히 줄어든다.
- indent도 줄일 수 있어서 가독성이 좋다.
- 원본 데이터로부터 데이터를 읽기만 할 뿐, 원본 데이터 자체를 변경하지 않는다.
중개 연산 매소드
- skip(long n) : 해당 스트림의 첫 번째 요소부터 전달된 개수만큼의 요소를 제외한 나머지 요소만으로 이루어진 새로운 스트림을 반환
단말 연산 매소드
- anyMatch : 하나라도 조건을 만족하는 요소가 있다면 True 반환
- allMatch : 모든 조건을 만족한다면 있다면 True 반환
- noneMatch : 모든 조건을 만족하지 않는다면 True 반환
- findFirst() : 처음으로 해당 요소를 찾았을때 Optional로 객체 반환
- findAny() : 전체를 돌고 해당 요소 하나라도 찾았을때 Optional로 객체 반환
- max() : 해당 스트림의 요소중 가장 큰 값을 가지는 요소를 참조하는 Optional로 객체 반환
- min() : 가장 작은 값을 가지는 요소를 참조하는 Optional로 객체 반환
- sum(), average() : 합, 평균값에 대하여 반환
Stream.of("3", "1", "4", "2", "5", "5") // 문자열 스트림 생성
.map(Integer::parseInt) // 문자열 스트림을 정수형 스트림으로 변환
.sorted() // 정렬
.distinct() // 중복제거
.limit(3) // 갯수를 3개로 제한
.collect(Collectors.toList()) // 리스트로 변환 => {1, 2, 3} : 단말 연산
.stream() // 다시 정수형 값을 갖는 스트림으로 변환
.filter(x -> x > 1) // 1보다 큰 값만 갖도록 필터링함 {2, 3}
.forEach(System.out::println); // 2와 3만 출력됨
Reference
728x90