stream은 배열이나 컬렉션 등을 모두 같은 방식으로 다룰 수 있게 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의해 놓았다.
🧡 stream의 특징
1. 데이터 소스를 변경하지 않는다.
2. 일회용이다.
3. 작업을 내부 반복으로 처리한다.
- 내부 반복은 반복문을 메서드의 내부에 숨길 수 있는 것이다.
- forEach()는 매개변수에 대입된 람다식을 데이터 소스의 모든 요소에 적용
🦔 stream 생성
Stream<T> Collection.stream()
컬렉션의 스트림 생성
T는 Integer 또는 String 같은 타입
Collection에는 list, set 같은 컬렉션
IntStream IntStream.of(int... values)
IntStream IntStream.of(int[])
IntStream Arrays.stream(int[])
IntStream Arrays.stream(int[] array, int startInclusive, int endExclusive)
기본형 배열의 스트림
🎀 데이터 소스의 요소를 기본형으로 다루는 스트림
IntStream |
LongStream |
DoubleStream |
🎨 스트림 중간 연산
Stream<T> filter(Predicate<T> predicate) | 조건에 안 맞는 요소 제외 |
IntStream mapToInt(ToIntFunction<T> mapper) | 스트림의 요소 변환 |
boolean anyMatch(Predicate<T> P) | 조건을 하나라도 만족하는지 |
😺 스트림 메소드
long count() | 스트림에서 요소의 갯수를 반환 |
🍨 anyMatch 사용하기
- 이중 for문이라고 생각하면 된다.
public void checkSeat(MakeReservationRequest makeReservationRequest) {
List<Reservation> reservationList =
reservationRepository.findListByFundingIdAndStatus(
makeReservationRequest.getFundingId(), 1);
List<Seat> requestSeat = makeReservationRequest.getSeats().getSeat();
List<Seat> seatList =
reservationList.stream()
.map(reservation -> reservation.getSeats().getSeat())
.flatMap(inner -> inner.stream())
.collect(Collectors.toList());
Optional<Seat> result = requestSeat.stream()
.filter(seat ->seatList.stream().anyMatch(Predicate.isEqual(seat)))
.findFirst();
// seat.equals(
// seatList.stream()
// .anyMatch(Predicate.isEqual(seat))))
// .findFirst();
// .filter(seat -> seat.equals(seatList.stream()
// .map(seat1 -> new Seat(seat1.getLine(), seat1.getCol()))))
//// .map(seat1 -> new Seat(seat1.getLine(),seat1.getCol()))))
// .findFirst();
if (result.isPresent()) {
throw new BadRequestException(CustomExceptionStatus.RESERVATION_SEAT);
}
}
참고 👉 자바의 정석 3판
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
반응형