데이터 준비 -> 중간 연산 -> 최종 연산 순으로 처리된다.각 요소를 10배로 변환 후 출력하는 예시로 알아봅시다.
arrayList 의 각 요소를 10배로 변환한다.for 문과 스트림 을 비교해 봅시다.List<Integer> arrayList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
public class Main {
public static void main(String[] args) {
// ArrayList 선언
List<Integer> arrayList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
// ✅ for 명령형 스타일: 각 요소 * 10 처리
List<Integer> ret1 = new ArrayList<>();
for (Integer num : arrayList) {
int multipliedNum = num * 10; // 각 요소 * 10
ret1.add(multipliedNum);
}
System.out.println("ret1 = " + ret1);
}
}
public class Main {
public static void main(String[] args) {
// ArrayList 선언
List<Integer> arrayList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
// ✅ 스트림 선언적 스타일: 각 요소 * 10 처리
List<Integer> ret2 = arrayList.stream().map(num -> num * 10).collect(Collectors.toList());
System.out.println("ret2 = " + ret2);
}
}
💡 ArrayList를 List로 받는 이유
다형성을 활용해List 인터페이스로ArrayList구현체를 받으면 나중에 다른 구현체(LinkedList,Vector) 로 변경할 때 코드 수정을 최소화할 수 있기 때문이다.- 실무에서 리스트를 선언할 때 대부분 아래와 같이
List타입으로 받는 것을 권장한다.List<Integer> arrayList = new ArrayList<>();
| 단계 | 설명 | 주요 API |
|---|---|---|
| 1. 데이터 준비 | 컬렉션을 스트림으로 변환 | stream(), parallelStream() |
| 2. 중간 연산 등록 (즉시 실행되지 않음) | 데이터 변환 및 필터링 | map(), filter(), sorted() |
| 3. 최종 연산 | 최종 처리 및 데이터 변환 | collect(), forEach(), count() |
✅ 스트림을 사용하여 각 요소를 10배로 변환 후 리스트로 변환하는 예제이다.
stream()→map()→collect()순으로 데이터 흐름을 처리한다.stream(): 데이터 준비 - 데이터를 스트림으로 변환하여 연산 흐름을 만들 준비한다.map(): 중간 연산 등록 - 각 요소를 주어진 함수에 적용해서 변환한다.collect(): 최종 연산 - 결과를 원하는 형태(List,Set)로 수집한다.- 반복문 없이 간결하게 데이터 변환이 가능하다.
arrayList
.stream() // 1. 데이터 준비
.map() // 2. 중간 연산 등록
.collect() // 3. 최종 연산
// 1. 데이터 준비: 스트림 생성
Stream<Integer> stream = arrayList.stream();
// 2. 중간 연산 등록: 각 요소를 10배로 변환 로직 등록
Stream<Integer> mappedStream = stream.map(num -> num * 10);
// 3. 최종 연산: 최종 결과 리스트로 변환
List<Integer> ret2 = mappedStream.collect(Collectors.toList());
// ✅ 한 줄로 표현 가능
List<Integer> ret2 = arrayList.stream() // 1. 데이터 준비
.map(num -> num * 10) // 2. 중간 연산 등록
.collect(Collectors.toList()); // 3. 최종 연산
스트림과 람다식을 함께 사용해서 다시 한번 각 요소 * 10 예시를 만들어 봅시다.
// map() 메서드를 살펴봅시다.
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
-> 함수형 인터페이스를 매개변수로 가지고 있다.
-> 즉, 함수형 인터페이스를 구현한 구현체를 매개변수로 받을 수 있다.
map() 을 활용해 봅시다.📗 익명 클래스를 변수에 담아 활용
- Function<T, R> T 는 매개변수, R 은 반환 타입을 의미합니다.
public class Main {
public static void main(String[] args) {
// ArrayList 선언
List<Integer> arrayList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
// ✅ 1. 익명클래스를 변수에 담아 활용
Function<Integer, Integer> function = new Function<>() {
@Override
public Integer apply(Integer integer) {
return integer * 10;
}
};
List<Integer> ret3 = arrayList.stream()
.map(function)
.collect(Collectors.toList());
System.out.println("ret3 = " + ret3);
}
}
📘 람다식을 변수로 활용
public class Main {
public static void main(String[] args) {
// ArrayList 선언
List<Integer> arrayList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
// ✅ 2. 람다식을 변수에 담아 활용
Function<Integer, Integer> functionLambda = (num -> num * 10);
List<Integer> ret4 = arrayList.stream()
.map(functionLambda)
.collect(Collectors.toList());
System.out.println("ret4 = " + ret4);
}
}
📙 람다식을 매개변수에 직접 활용
public class Main {
public static void main(String[] args) {
// ArrayList 선언
List<Integer> arrayList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
// ✅ 3. 람다식을 직접 활용
List<Integer> ret5 = arrayList.stream()
.map(num -> num * 10)
.collect(Collectors.toList());
System.out.println("ret5 = " + ret5);
}
}
📚 전체 코드
public class Main {
public static void main(String[] args) {
// ArrayList 선언
List<Integer> arrayList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
// 스트림 없이: 각 요소 * 10 처리
ArrayList<Integer> ret1 = new ArrayList<>();
for (Integer num : arrayList) {
int multipliedNum = num * 10;
ret1.add(multipliedNum);
}
System.out.println("ret1 = " + ret1);
// 스트림 활용: 각 요소 * 10 처리
List<Integer> ret2 = arrayList.stream().map(num -> num * 10).collect(Collectors.toList());
System.out.println("ret2 = " + ret2);
// 직접 map() 활용해보기
// 1. 익명클래스를 변수에 담아 전달
Function<Integer, Integer> function = new Function<>() {
@Override
public Integer apply(Integer integer) {
return integer * 10;
}
};
List<Integer> ret3 = arrayList.stream()
.map(function)
.collect(Collectors.toList());
System.out.println("ret3 = " + ret3);
// 2. 람다식을 변수에 담아 전달
Function<Integer, Integer> functionLambda = (num -> num * 10);
List<Integer> ret4 = arrayList.stream()
.map(functionLambda)
.collect(Collectors.toList());
System.out.println("ret4 = " + ret4);
// 람다식 직접 활용
List<Integer> ret5 = arrayList.stream()
.map(num -> num * 10)
.collect(Collectors.toList());
System.out.println("ret5 = " + ret5);
}
}
리스트에서 짝수만 10배로 변환시키는 예시를 통해 알아봅시다.
filter() 와 map() ) 을 조합하여 짝수만 10배 변환시킨다.List<Integer> arrayList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
// ✅ filter() + map() 사용 예제
List<Integer> ret6 = arrayList.stream() // 1. 데이터 준비: 스트림 생성
.filter(num -> num % 2 == 0) // 2. 중간 연산: 짝수만 필터링
.map(num -> num * 10) // 3. 중간 연산: 10배로 변환
.collect(Collectors.toList()); // 4. 최종 연산: 리스트로 변환
System.out.println(ret6); // 출력: [20, 40]
// For 문 예시
List<Integer> arrayList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
List<Integer> ret6 = new ArrayList<>();
for (int num : arrayList) {
int remain = num % 2;
if (remain == 0) {
int data = num * 10;
ret6.add(data);
}
}
// 5. 결과 출력
System.out.println(ret6); // 출력: [20, 40]