for + if
List<String> names = Arrays.asList("John", "Doe", "Jane", "Doe");
List<String> result = new ArrayList<>();
for (String name : names) {
if (name.startsWith("J")) {
result.add(name);
}
}
System.out.println(result); // [John, Jane]
Stream + Lamda
List<String> result = names.stream()
.filter(name -> name.startsWith("J"))
.collect(Collectors.toList());
System.out.println(result); // [John, Jane]
✅ 코드의 가독성 향상
✅ 예외 추적이 필요없는 경우
for each
List<String> names = Arrays.asList("John", "Jane", "Jack");
List<Integer> nameLengths = new ArrayList<>();
for (String name : names) {
nameLengths.add(name.length());
}
System.out.println(nameLengths); // [4, 4, 4]
Stream
List<Integer> nameLengths = names.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(nameLengths); // [4, 4, 4]
✅ 코드 가독성 향상
for
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (int num : numbers) {
sum += num;
}
System.out.println(sum); // 15
Stream
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println(sum); // 15
✅ 코드 가독성 향상
✅ 별도 연산 로직 구현보다 제공 함수를 사용
✅ 코드 가독성 향상의 목적
✅ 코드를 선언형 형태로 변경
✅ 스트림 다중 연산 시 병렬 스트림을 통한 성능 최적화
❌ 명확한 예외 처리가 필요한 경우
❌ 람다 표현식 자체가 너무 많아지는 경우
❌ 단순 반복 연산의 경우
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// for
for (int num : numbers) {
System.out.println(num);
}
// stream
numbers.forEach(System.out::println);
// for
List<Integer> doubled = new ArrayList<>();
for (int num : numbers) {
doubled.add(num * 2);
}
System.out.println(doubled);
// stream
List<Integer> doubled = numbers.stream()
.map(num -> num * 2)
.collect(Collectors.toList());
System.out.println(doubled);
// 데이터 100만개
List<Integer> numbers = IntStream.range(1, 1_000_000).boxed().collect(Collectors.toList());
// for
List<Integer> filtered = new ArrayList<>();
for (int num : numbers) {
if (num % 2 == 0) {
filtered.add(num);
}
}
// Stream
List<Integer> filtered = numbers.stream()
.filter(num -> num % 2 == 0)
.collect(Collectors.toList());
// parallelStream
List<Integer> filtered = numbers.parallelStream()
.filter(num -> num % 2 == 0)
.collect(Collectors.toList());