for, while, if 등의 제어문을 사용하여 반복과 조건을 직접 제어Predicate를 사용하며, boolean 값을 반환하는 함수형 인터페이스Predicate<Integer> evenPredicate = n -> n % 2 == 0;
List<Integer> evenNumbers = numbers.stream()
.filter(evenPredicate)
.collect(Collectors.toList());
Function을 사용하며, 입력값을 다른 타입이나 형태로 변환하는 역할 수행Function<String, Integer> lengthMapper = s -> s.length();
List<Integer> lengths = strings.stream()
.map(lengthMapper)
.collect(Collectors.toList());
List<Integer> filtered = GenericFilter.filter(numbers, n -> n % 2 == 0);
List<Integer> mapped = GenericMapper.map(filtered, n -> n * 2);
List<Integer> result = MyStream.of(numbers)
.filter(n -> n % 2 == 0)
.map(n -> n * 2)
.toList();
break, continue)가 쉽지만, 반복 구조가 복잡해지면 코드의 가독성이 떨어질 수 있음for (String s : list) {
System.out.println(s);
}
list.stream().forEach(s -> System.out.println(s));
MyStream.of(numbers);
람다 표현식과 스트림을 적극 활용하면 선언적 프로그래밍을 통해 더욱 간결하고 직관적인 코드를 작성할 수 있다. 명령형 프로그래밍은 세부적인 제어가 필요할 때 적합하며, 상황에 따라 두 방식을 적절히 활용하면 더욱 효율적인 프로그래밍이 가능하다.