검증, 객체 모델, 컬렉션과 Stream을 하나의 프로그램으로 연결합니다.
실제 개발에서는 여러 문법을 계층별 책임으로 조합합니다. 입력 검증은 생성자, 데이터 보관은 객체와 컬렉션, 집계는 서비스 메서드, 출력은 진입점이 담당하도록 나눕니다.
sorted는 comparingDouble(StudyRecord::getRate)를 reversed()로 뒤집은 기준에 따라 완료율이 높은 순서로 흐름을 정렬하지만, 원래 records 목록의 순서는 바꾸지 않습니다. 22/24는 0.91666...이라 %.1f에서 91.7로 반올림되고, 18/24와 15/24는 정확히 75.0과 62.5로 출력됩니다. 생성자의 진도 조건 때문에 completed가 total보다 큰 기록은 목록에 들어가기 전에 예외로 막힙니다.
아래 프로그램은 불변 값 객체로 학습 기록을 검증하고 Stream으로 완료율 순위를 계산합니다. 각 단계는 별도 테스트가 가능합니다.
실무에서는 외부 입력 DTO와 도메인 모델, 저장 모델을 필요에 따라 분리하고 오류를 안정적인 API 응답으로 변환합니다.
파싱, DB 접근, 계산과 출력까지 main의 큰 반복문 하나에 넣지 마세요.
직접 바꿔보세요사용자별 여러 기록을 합산하는 서비스로 확장하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.