👉 이 게시글은 inflearn의 코딩으로 학습하는 리팩토링 강의 내용을 바탕으로 작성되었습니다.
초창기 프로그래밍 언어부터 있었던 반복문은 최근 여러 언어들이 함수형 프로그래밍을 지원함에 따라, 반복문을 처리할 때 파이프라인 기능을 통해 리팩토링을 할 수 있게 되었습니다. Java또한 함수형 프로그래밍을 지원하고 이에 따라 반복문에 비해 더 나은 대안책이 생겼다고 할 수 있습니다.
이 글에서는 반복문을 파이프라인으로 바꾸는 리팩토링 기법을 살펴보도록 하겠습니다. filter나 mapping과 같은 파이프라인 기능을 사용해 보다 빠르게 함수가 어떤 작업을 하는지 파악할 수 있습니다.
- filter(필터): 전달받은 조건을 만족하는(true) 데이터만 다음 오퍼레이션으로 전달한다.
- map(맵): 전달받은 함수를 사용해 입력값을 원하는 출력값으로 변환하여 다음 오퍼레이션으로 전달한다.
public class Author {
static public List<String> TwitterHandles(List<Author> authors, String company) {
var result = new ArrayList<String>();
for (Author a : authors) {
if (a.company.equals(company)) {
var handle = a.twitterHandle;
if (handle != null)
result.add(handle);
}
}
return result;
}
}
Author 클래스 타입의 리스트를 순회하면서 특정 조건을 만족하는 객체만을 result 리스트에 담아 반환하는 코드입니다. 위에서 언급한 filter와 map을 적용하면 코드를 다음과 같이 리팩토링할 수 있습니다.
public class Author {
static public List<String> TwitterHandles(List<Author> authors, String company) {
return authors.stream()
.filter(author -> author.company.equals(company))
.map(author -> author.twitterHandle)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
}
객체의 인스턴스 변수의 값이 특정 값과 일치하는지, 또는 null인지 아닌지와 같은 조건을 판단하는 부분을 filter를 통해, 전달하는 값에 변환이 필요한 경우에는 map을 통해 위와 같이 보다 직관적으로 코드를 리팩토링할 수 있습니다.