[Java]책 분류해서 조회하기 - Stream

김세림·2024년 5월 1일

Java_코드공부

목록 보기
6/7
post-thumbnail

책 분류해서 조회하기 - Stream


stream을 사용해서 원하는대로 값을 분류하고 조회하는 코드를 만들어보겠다!
기본 코드는 아래와 같다.

기본코드

public class Main {
    public static void main(String[] args) {
        List<Book> bookList = Arrays.asList(
                new Book(1L, "모두의 딥러닝", "조태호", "IT", 21600),
                new Book(2L, "이득우의 게임 수학", "이득우", "IT", 40500),
                new Book(3L, "자바 웹 개발 워크북", "구멍가게 코딩단", "IT", 31500),
                new Book(4L, "실전 시계열 분석", "에일린 닐슨", "IT", 34200),
                new Book(5L, "데이터 분석가의 숫자유감", "권정민", "IT", 14400),
                new Book(6L, "스프링 부트 실전 활용 마스터", "그렉 턴키스트", "IT", 25200),
                new Book(7L, "오늘부터 IT를 시작합니다", "고코더", "IT", 16200),
                new Book(8L, "그림으로 이해하는 인지과학", "기타하라 요시노리", "IT", 16200),
                new Book(9L, "괜찮아, 그 길 끝에 행복이 기다릴 거야", "손미나", "여행", 17100),
                new Book(10L, "여행의 이유", "김영하", "여행", 12150),
                new Book(11L, "여행의 시간", "김진애", "여행", 16200),
                new Book(12L, "로봇 시대 살아남기", "염규현", "역사", 14850),
                new Book(13L, "경제 전쟁의 흑역사", "이완배", "역사", 15750),
                new Book(14L, "100가지 동물로 읽는 세계사", "사이먼 반즈", "역사", 29700),
                new Book(15L, "k 배터리 레볼루션", "박순혁", "경제", 17100),
                new Book(16L, "정하준의 경제학 레시피", "장하준", "경제", 16200),
                new Book(17L, "레버리지", "롭 무어", "경제", 16200)
        );

						
    }
}

class Book {
    // 분류번호
    private Long id;
    // 책 이름
    private String bookName;
    // 작가 이름
    private String author;
    // 카테고리
    private String category;
    // 가격
    private double price;

    public Book(Long id, String bookName, String author, String category, double price) {
        this.id = id;
        this.bookName = bookName;
        this.author = author;
        this.category = category;
        this.price = price;
    }

    public String getBookName() {
        return bookName;
    }

    public String getCategory() {
        return category;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

카테고리가 여행인 책 제목 조회

카테고리는 getCategory로 가져오고 책 제목은 getBookName으로 가져온다.
또, 원하는 값만 추출하는 것이니 filter를 사용하면 될 것 같다.

bookList.stream.filter(book->book.getCategory().equals("여행")
	.forEach(f->System.out.println("카테고리가 여행인 책 제목 : " + f.bookName));

가격이 16200원 이하인 책 제목 조회

가격은 getPrice를 통해 가져오면 될것 같고 위처럼 filter를 사용하면 된다.

bookList.stream().filter(book -> book.getPrice()<=16200)
                .forEach(f-> System.out.println("가격이 16200원 이하인 책 제목 : " + f.getBookName()));

책 제목에 "경제"라는 용어가 들어간 책 제목 조회

경제라는 용어가 들어간다는 것이니 위처럼 equals를 사용하면 안될 것 같고 contains를 사용하면 될것같다.

bookList.stream().filter(book->book.getBookName().contains("경제"))
                .forEach(f-> System.out.println("책 제목에 "경제"라는 용어가 들어간 책 제목 : " + f.getBookName()));

가격이 가장 비싼 책 가격 조회

여기에선 가격이 가장 비싼 책을 mapToDouble()을 사용해 Book::getPrice로 책의 가격을 가져온 다음 max()를 사용하면 최댓값을 구할 수 있다.

double maxPrice = bookList.stream().mapToDouble(Book::getPrice).max().getAsDouble();

System.out.println("가격이 가장 비싼 책 가격 : " + maxPrice);

여기서 문제점이 힌트에서 mapToDouble과 max까지 나와있었는데 maxPrice변수에 담아지지않았다.
컴파일에러가 나서 밑줄에 마우스를 가져다대어보니 .getAsDouble를 사용해야한다고 나왔다.
찾아보니 max()를 통해 최대값을 구했지만 가져오는 함수가 없어서 maxPrice에 저장을 하지 못했던 것이다.
get()을 통해 Optional객체의 값을 가져올 수 있으며 앞에 mapToDouble로 double값을 지정해주었으니 그에 맞게 getAsDouble로 가져올 수 있었던 것이다.

카테고리가 IT인 책들의 가격 합 조회

위에 3개가 합쳐진 문제라고 볼 수 있겠다.
우선 카테고리가 IT인것을 filter를 통해 분류하고 뒤에 mapToDouble과 sum을 사용해 더하면 될 것 같다.

double sumPrice = bookList.stream().filter(book -> book.getCategory().equals("IT"))
                .mapToDouble(Book::getPrice).sum();
        System.out.println("카테고리가 IT인 책들의 가격 합 : " + sumPrice);

IT 책 할인 이벤트!

  • 카테고리가 IT인 책들의 가격을 40% 할인하여 새로운 책 리스트 만드는 문제이다.
    - List 변수명: discountedBookList
    우선 IT카테고리를 filter하고, map을 통해 가격을 수정한 다음, toList로 리스트를 새로 만들면 될 것 같다.
List<Book> discountedBookList = bookList.stream().filter(book -> book.getCategory().equals("IT"))
                .map(book -> {
                book.setPrice(book.getPrice() * 0.6); 
                return book;
                }).toList();
                
for (Book book : discountedBookList) {
            System.out.println("할인된 책 제목: " + book.getBookName());
            System.out.println("할인된 책 가격: " + book.getPrice() + "\n");
        }

0개의 댓글