반응형
간단한 예시를 통해 동작 파라미터화가 왜 필요하고 어떻게 코드 개선될 수 있는지 보자.
Niniz 객체를 담고 있는 리스트에서 원하는 니니즈를 찾는 프로그램을 개발한다고 가정하겠다.
Niniz 클래스는 아래와 같다.
/* Niniz.java */
public class Niniz {
private String name;
private String color;
private String classification;
public Niniz(String name, String color, String classification) {
this.name = name;
this.color = color;
this.classification = classification;
}
public String getName() {
return name;
}
public String getColor() {
return color;
}
public String getClassification() {
return classification;
}
}
자바 8 이전에는 Ninizs 리스트에서 초록색인 Niniz를 찾으려면 아래와 같이 했을 것이다.
간단한 로직이여서 한눈에 이해가 되지만, 실제 비즈니스 로직이면 훨씬 복잡했을 것이다.
/* Main.java */
public class Main {
public static void main(String[] args) {
List<Niniz> ninizs = init();
List<Niniz> result = new ArrayList<>();
for(Niniz niniz : ninizs) {
if(niniz.getColor().equals("초록색")) {
result.add(niniz);
}
}
}
private static List<Niniz> init() {
return asList(new Niniz("죠르디", "초록색", "파충류")
, new Niniz("스카피", "분홍색", "포유류")
, new Niniz("앙몬드", "흰색", "포유류"));
}
}
위 로직을 스트림과 동작 파리미터 화를 사용하면 아래와 같이 개선이 가능하다.
public class Main {
public static void main(String[] args) {
List<Niniz> ninizs = init();
List<Niniz> result = ninizs.stream()
.filter(niniz -> niniz.getColor().equals("초록색"))
.collect(toList());
}
private static List<Niniz> init() {
return asList(new Niniz("죠르디", "초록색", "파충류")
, new Niniz("스카피", "분홍색", "포유류")
, new Niniz("앙몬드", "흰색", "포유류"));
}
}
좀더 짧고 간결해진 것을 알 수 있는데, 대략적인 내용은 초록색인 니니즈를 필터하고 이를 리스트로 변환해 반환하는 코드이다.
앞선 내용에서 스트림은 출력이 곧 입력될 수 있다는 내용이 있는데, 포유류인 니니즈를 필터를 한 후에 흰색인 니니즈를 찾아보도록 하겠다.
public class Main {
public static void main(String[] args) {
List<Niniz> ninizs = init();
List<Niniz> result = ninizs.stream()
.filter(niniz -> niniz.getClassification().equals("포유류"))
.filter(niniz -> niniz.getColor().equals("흰색"))
.collect(toList());
}
private static List<Niniz> init() {
return asList(new Niniz("죠르디", "초록색", "파충류")
, new Niniz("스카피", "분홍색", "포유류")
, new Niniz("앙몬드", "흰색", "포유류"));
}
}
filter 메소드에 들어가는 로직을 참조 객체로 선언하고 이를 할당하는 것 또한 가능하다.
public class Main {
private static Predicate<Niniz> mammalFilter = niniz -> niniz.getClassification().equals("포유류");
private static Predicate<Niniz> whiteFilter = niniz -> niniz.getClassification().equals("포유류");
public static void main(String[] args) {
List<Niniz> ninizs = init();
List<Niniz> result = ninizs.stream()
.filter(mammalFilter.and(whiteFilter))
.collect(Collectors.toList());
}
private static List<Niniz> init() {
return asList(new Niniz("죠르디", "초록색", "파충류")
, new Niniz("스카피", "분홍색", "포유류")
, new Niniz("앙몬드", "흰색", "포유류"));
}
}
반응형
'Book' 카테고리의 다른 글
[모던 자바 인 액션] 6장. 스트림으로 데이터 수집 (0) | 2021.09.28 |
---|---|
[모던 자바 인 액션] 5장. 스트림 활용 (0) | 2021.09.28 |
[모던 자바 인 액션] 4장. 스트림 소개 (0) | 2021.09.28 |
[모던 자바 인 액션] 3장. 람다 표현식 (0) | 2021.09.28 |
[모던 자바 인 액션] 1장. 자바 8, 9, 10, 11 : 무슨 일이 일어나고 있는가? (0) | 2021.09.28 |