forEach 없게 리팩토링 하는 방법
void foo() {
List<String> names = getNames();
// some logic
names.forEach(name -> {
String email = nameToEmail(name);
sendEmail(email);
});
}
개선 코드
void foo() {
List<String> names = getNames();
// some logic
Stream<String> emails = names
.stream()
.map(name -> nameToEmail(name));
sendMails(emails);
}
void sendMails(Stream<String> emails) {
for (String email : emails) {
sendMail(email);
}
}
Q: Stream 대신 List 사용해도 되나요?
A: List 사용을 더 선호 함. Stream보다 디버깅하기 용이하기 때문. 리스트가 메모리 조금 더쓰는건 의미 없다 생각.
Q: 스트림 관련 코드가 길어서 가독성이 떨어졌어요
A: 예시로 자바를 사용하였는데 반쪽짜리 함수형 지원(확장함수의 부재)으로 가독성이 떨어졌음. 확장함수를 사용하면 간결하고 가독성 좋은 코드를 만들 수 있음.위 코드는 예시라 타입을 다 붙였는데 타입추론까지 곁들이면 더욱 간결해짐. 아래는 코틀린에서의 예시 코드
fun foo() {
val names = getNames()
// some logic
val emails = names.map { nameToEmail(it) }
sendMails(emails)
}
fun sendMails(emails: List<String>) {
for (email in emails) {
sendMail(email)
}
}