필터와 맵, 스트림으로 람다식을 활용할 수 있다.
필터는 특정 조건을 만족하는 데이터만 선별하는 작업이다.
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
public static <T> List<T> filter(List<T> list, Predicate<T> predicate) {
List<T> result = new ArrayList<>();
for (T item : list) {
if (predicate.test(item)) {
result.add(item);
}
}
return result;
}
맵은 데이터를 다른 형태로 변환하는 작업이다.
List<Integer> numbers = strings.stream()
.map(Integer::valueOf)
.collect(Collectors.toList());
public static <T, R> List<R> map(List<T> list, Function<T, R> mapper) {
List<R> result = new ArrayList<>();
for (T item : list) {
result.add(mapper.apply(item));
}
return result;
}
스트림은 데이터 처리 작업을 하나의 흐름으로 연결한 것이다.
List<String> names = students.stream()
.filter(s -> s.getScore() >= 80)
.map(Student::getName)
.collect(Collectors.toList());
students.stream()
.filter(s -> s.getScore() >= 80)
.map(Student::getName)
.forEach(name -> System.out.println("name: " + name));
객체 생성 과정을 메서드로 캡슐화하여 가독성을 높이는 방법이다.
MyStream.of(list)
명령형 스타일
List<Integer> result = new ArrayList<>();
for (Integer number : numbers) {
if (number % 2 == 0) {
result.add(number * 2);
}
}
선언형 스타일
List<Integer> result = numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * 2)
.collect(Collectors.toList());
선언형 프로그래밍은 코드를 간결하게 만들고, 가독성과 유지보수성을 향상시킨다.