728x90
반응형
노션 페이지
자바 스트림 | Notion
[Day] 08.06 [Chapter] ~ 6강 / 문제 1
www.notion.so
[Day] 08.06
[Chapter] ~ 6강 / 문제 1
📌 자바 스트림
선언형⭕️ (명령형 ❌)

✅ 스트림 동작 설명
- Filter ➡️ 필터링
- Map ➡️ 가공
- Collect ➡️ 담아서 배송
📌 명령형과 선언형 차이
명령형 how?? -> if, for
선언형 What?? -> stream api
public class Main {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9,10};
// 출력
// 명령형
// 장: 직관적, 자유도.
// 단: 실수할 확률. 코드가 조금 복잡해지면 의도가 잘 안보인다.
for(int i = 0; i < 10; i++) {
System.out.println(arr[i]);
}
// 선언형
// 하고싶은 것을 언급 -> 어떻게 할 것인지는? 자바가 알아서 해줌.
// 장: 실수할 확률 줄어듦. 코드 의도가 좀 더 명확히 드러남
Arrays.stream(arr)
.forEach(System.out::println); //뭘 사용할지만 알려주면 forEach가 알아서 해줌
}
}
[ 예제 1️⃣ ] 테스트 메서드 활용
public class JavaStream {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9,10};
for(int i = 0; i < 10; i++) {
System.out.println(arr[i]);
}
Arrays.stream(arr)
.forEach(JavaStream::test); // 메서드 레퍼런스
test(10);
}
public static void test(int num) {
System.out.println("숫자 : %d".formatted(num));
}
}
[ 예제 2️⃣ ] 람다 사용
간편한 일회성 메서드 사용 가능 ⭕️
➡️ 메서드 활용이 불편할 때, 람다 사용
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < 10; i++) {
System.out.println(arr[i]);
}
Arrays.stream(arr)
.forEach(Main::test); // 메서드 레퍼런스
// 1 ~ 100까지 수 중에서 짝수만 출력
IntStream
.rangeClosed(1, 100)
.forEach(
(num) -> {
if (num % 2 == 0) {
System.out.println("짝수 : %d".formatted(num));
}
}
);
// 1회성 함수 => 익명함수 => 람다
// () -> { System.out.println("Hello, World!"); }
// 스트림에서는 람다를 많이 사용.
// 단, 재사용성이 높거나 복잡한 코드는 함수로 정의해서 사용하는 것이 좋음.
}
public static void test(int num) {
System.out.println("숫자 : %d".formatted(num));
}
}
✅ 스트림 매개변수 1개씩
✅ 단일 명령어는 중괄호 없애도 됨
✅ 직접 정의보단 람다 사용 (1회성)
✅ 재사용 높은 코드 & 복잡한 코드 ➡️ 함수로 만들어서 사용
[ 예제 3️⃣ ] filter 사용
원하는 요소만 선택
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < 10; i++) {
System.out.println(arr[i]);
}
Arrays.stream(arr)
.forEach(Main::test); // 메서드 레퍼런스
System.out.println("== 1부터 100 스트림 출력 ==");
// 1 ~ 100까지 수 중에서 짝수만 출력
IntStream
.rangeClosed(1, 100) // 첫번째 스트림
.filter((num) -> { // 두번째 스트림
return num % 2 == 0; // 짝수만 통과
})
.forEach(System.out::println); // 최종 처리
IntStream
.rangeClosed(1, 100) // 첫번째 스트림
.filter(num -> num % 2 == 0) // 이렇게 축약 표현도 가능.
.forEach(System.out::println); // 최종 처리
}
}
✅ Trace Current Stream Chain 기능으로 시각적 확인 가능
✅ return 없이 축약 가능
[ 예제 4️⃣ ] 종단함수 사용
종단함수 사용 시 스트림 끝남
보통 처리 결과를 배열이나 리스트로 받는 toArray, toList 많이 사용
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < 10; i++) {
System.out.println(arr[i]);
}
System.out.println("== 1부터 100 스트림 출력 ==");
IntStream
.rangeClosed(1, 100)
.filter((num) -> {
return num % 2 == 0;
})
.forEach(System.out::println); // 스트림 종료 => 종단 함수 (collect, forEach, toArray)
IntStream
.rangeClosed(1, 100)
.filter(num -> num % 2 == 0)
.forEach(System.out::println); // 반환 없이 처리하고 종료
int[] arr2 = IntStream
.rangeClosed(1, 100)
.filter(num -> num % 2 == 0)
.toArray(); // 스트림의 결과를 배열로 반환
System.out.println(arr2.length); // 50
}
}
✅ 종단함수 무조건 체이닝 마지막(종단함수 이후에 체이닝 안됨)
✅ foreach는 void / 즉, 리턴이 없음. 그래서 마지막에 처리해서 끝.
✅ 연속적인 작업할 때 스트림 쓰지만, 스트림 != 배열 != list
✅ toArray로 스트림 안줘서 종단함수
📌 문제
public class JavaStream {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 문제
// arr의 모든 요소 값이 2배된 배열 만들기
//명령형
int[] arr2 = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
arr2[i] = arr[i] * 2;
}
System.out.println(Arrays.toString(arr2));
//선언형
int[] arr2 = Arrays.stream(arr)
.map((int num) -> {
return num * 2;
})
.toArray();
System.out.println(Arrays.toString(arr2));
// arr의 모든 요소 값이 3배된 배열 만들기
//선언형
int[] arr3 = Arrays.stream(arr)
.map((int num) -> {
return num * 3;
})
.toArray();
System.out.println(Arrays.toString(arr3));
// arr의 모든 요소 값이 10배된 배열 만들기
//선언형
int[] arr10 = Arrays.stream(arr)
.map((int num) -> {
return num * 10;
})
.toArray();
System.out.println(Arrays.toString(arr10));
}
}728x90
반응형