stream 내부에서 객체 다운캐스팅

6177 단어 자바자바

리스트에 Product객체를 저장했는데 Product를 상속받는 TV라는 객체가 저장되어 있었다.

이 리스트를 탐색하면서 TV 객체 중 특정 속성을 갖는 TV만을 리스트로 만들어 반환하고 싶다.

public List<Product> findTVByInch(int inch) {
	// TODO Auto-generated method stub
	List<Product> result = new ArrayList<>();
    
	for (Product product : products) {
		if (product.getType().equals("TV")) {
			TV t = (TV) product;
			if (t.getInch() >= inch)
				result.add(t);
		}
        }
		
	return result;
}

위와 같이 구현할 수 있을 것이다. 하지만 코드가 길어 stream을 이용해 간결하게 처리할 방법이 없을까 생각을 했다.

그렇지만 Product 객체를 저장하는 리스트에서 TV의 속성에 접근할 방법이 없기때문에 Product 객체를 TV로 다운캐스팅을 해야했다.

하지만 내가 아는 방식으로는 다운캐스팅을 하지 못하고 계속 에러가 났다. 그래서 결국 forEach로 해결을 했는데 다른 방법이 있었다.

스트림 내부의 객체를 변경하기 위해서 쓰는 api가 map이라는 사실을 알게되어 문제를 해결했다.

public List<Product> findTVByInch(int inch) {
	List<Product> result = products.stream().filter(p->p.getType().equals("TV"))
    			.map(p -> (TV) p)
			.filter(r -> r.getInch() >= inch)
			.collect(Collectors.toList());
	return result;
}

좋은 웹페이지 즐겨찾기