일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- apache란
- 안드로이드 스튜디오 custom dialog
- recyclerview item recycle
- 객체지향 프로그래밍 5가지 원칙
- 디자인 패턴 예제
- 안드로이드 스튜디오 반복되는 레이아웃 코드
- LifeCycle
- 다른 객체 리스트의 비교
- savedinstancestate
- java thread 예제
- 안드로이드 디자인패턴
- 아파치란
- apache nginx
- 안드로이드 스튜디오 인터넷 연결 안되어 있을 때
- edittext 연결
- java
- Kotlin
- AAC
- 변수
- 이중for문 사용 안하기
- 자바 스레드 예제
- dagger error
- 리사이클러뷰 아이템 재사용
- Thread
- 안드로이드 스튜디오 tts
- hilt error
- 안드로이드 스튜디오 인터넷 연결 확인
- 안드로이드 스튜디오 커스텀 다이얼로그
- 아파치 엔진엑스
- 안드로이드 스튜디오 style
- Today
- Total
Sam Story
Java - Stream 본문
오늘은 Java Stream에 대해서 간단하게 포스팅 해보려 한다.
Stream 이란?
다양한 데이터 소스(Collection , 배열)를 표준화된 방법으로 다루기 위한 것
데이터의 연속적인 흐름을 Stream 이라고 한다.
컬렉션(Collection), 배열(Array) 등의 데이터를 함수형 스타일로 처리할 수 있도록 도와주는 기능이다.
기존의 반복문(Loop) 기반 처리보다 간결하고 가독성이 좋으며, 병렬 처리도 쉽게 할 수 있다.
Collection의 요소인 List,Set,Map 등 같은 Collection 이지만 연산하는 방법이 전부 다르다.
이러한 요소들을 Stream을 통해서 연산이 가능하다는 것이다.
Stream의 특징
먼저 Stream은 중간연산과 최종연산으로 구성되어 있다.
● 중간연산 : 연산을 수행하지만 최종 연산이 호출되기 전까지 실행되지 않는다 - 지연된 연산(중간연산을 필요할 때 수행)
( 0 ~ n 번의 연산)
● 최종연산 : Stream의 모든 요소를 소모하여 결과를 반환하거나 출력한다.
( 0 ~ 1 번의 연산)
● 데이터 소스(원본)로 부터 데이터를 읽기만할 뿐 변경하지 않는다.
● 일회용이다. (필요하면 다시 Stream을 생성해야 한다.)
● 최종 연산 전까지 중간연산이 수행되지 않는다. (지연된 연산 (중간연산을 필요할 때 수행한다.))
● 작업을 내부 반복으로 처리한다.
● 작업을 병렬로 처리할 수 있다.
예제
예제를 통해서 특징과 사용법을 알아보자.
Stream의 생성
list를 이용한 Stream 생성
List<Integer> list = Arrays.asList(3,1,5,4,2);
Stream<Integer> intStream = list.stream();
array를 이용한 Stream 생성
int[] arr = {8,6,10,9,7};
IntStream intStream = Arrays.stream(arr);
위 두가지의 경우 array를 이용한 Stream을 생성할 때 IntStream 객체로 생성했다.
그 이유는 Stream<T> 의 경우 Type이 기본형이 아닌 참조형만 타입추론이 가능하기 때문이다.
int 배열의 경우 Integer 객체로 변환 후 Stream으로 생성하려면 그만큼의 리소스 낭비가 생기기 때문에
이를 위한 원시타입 Stream들이 있다고 한다. (ex IntStream,DubbleStream..)
특징들을 이용한 간단한 예제
Animal class
class Animal {
String name;
String type;
int age;
int power;
public Animal(String name,String type,int age,int power){
this.name = name;
this.type = type;
this.age = age;
this.power = power;
}
// 출력시 객체주소값이 아닌 객체값 출력
@Override
public String toString() {
return name + " (" + type + "동물," + age + "세," + power + "의 파워)";
}
}
Main
public class Example {
public static void main(String[] args) {
// 동물 리스트 생성
List<Animal> animals = Arrays.asList(
new Animal("호랑이","육식",8,90),
new Animal("코끼리","초식",6,100),
new Animal("토끼","초식",1,10),
new Animal("햄스터","잡식",1,7),
new Animal("Oscar","잡식",30,5)
);
// 초식동물중에 50이상의 power를 가진 동물 필터링(filter)
List<Animal> highPowerAnimals = animals.stream()
.filter(animal -> animal.type.equals("초식") && animal.power > 50).collect(Collectors.toList());
System.out.println("초식동물 중 강한동물 : ");
highPowerAnimals.forEach(System.out::println);
// 동물들의 이름만 출력
List<String> animalNames = animals.stream()
.map(animal -> animal.name).collect(Collectors.toList());
System.out.println();
System.out.println("동물 이름 목록 : ");
animalNames.forEach(System.out::println);
// 나이순으로 정렬
List<Animal> sortedByAge = animals.stream()
.sorted((animal1,animal2) -> Integer.compare(animal1.age,animal2.age)).collect(Collectors.toList());
System.out.println();
System.out.println("동물 나이 순서 정렬 (오름차순) : ");
sortedByAge.forEach(System.out::println);
}
}
실행결과

이러한 Stream을 이용하면 데이터 처리 로직을 간결하고 효율적으로 작성할 수 있고,
지연 연산으로 최적화가 가능하며 병렬 처리를 활용할 수 도 있다.
기존 반복문에 여러 조건을 만들거나, 여러번 반복해서 순회하는 것 보다
Stream을 이용하면 가독성과 유지보수성이 뛰어나다는걸 알게 되었다.
'JAVA' 카테고리의 다른 글
Java - JVM 메모리 구조 , Stack, Heap (1) | 2024.12.04 |
---|---|
JAVA - Stack (1) | 2024.11.30 |
JAVA - 인터페이스 (2) | 2024.11.22 |
JAVA - 추상클래스 (0) | 2024.11.21 |
JAVA - 의존 역전 원칙 (2) | 2024.10.20 |