728x90
반응형
SMALL
스트림이란?
컬렉션 및 배열에 저장된 요소를 반복 처리하기 위해서 for문 / Iterator(반복자)를 이용했다.
List<String> list = ...;
for(int i =0; i<list.size(); i++){
String item = list.get(i);
}
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
String item = iterator.next();
}
Java 8부터 스트림을 사용할 수 있다.
*스트림 : 요소들이 하나씩 흘러가면서 처리된다.
Stream<String> stream = list.stream();
stream.forEach(
item -> System.out.println(item)
);
* Stream과 Iterator의 차이점
1) 내부 반복자이므로 처리 속도가 빠르고 병렬 처리에 효율적이다.
2) 람다식으로 다양한 요소 처리를 정의할 수 있다.
3) 중간 처리와 최종 처리를 수행하도록 파이프 라인을 형성할 수 있다.
내부 반복자
for문과 Iterator는 컬렉션의 요소를 컬렉션 바깥쪽으로 반복해서 가져와 처리 => 외부 반복자
스트림은 컬렉션 내부에서 요소를 반복하여 처리 => 내부 반복자
중간 처리와 최종 처리
스트림은 하나 이상 연결될 수 있다. 사진을 보면 오리지날->중간 스트림->매핑 중간 스트림으로 연결된다
=> 스트림 파이프라인이라고 한다.
//Student 스트림
Stream<Student> studentStream = list.stream();
//score 스트림
IntStream scoreStream = studentStream.mapToInt(student->student.getScore());
//평균 계산
double age = scoreStream.average().getAsDouble();
//메소드 체이닝 패턴을 이용해 간결하게 작성
double avg = list.stream()
.mapToInt(student -> student.getScore())
.average()
.getAsDouble();
리소스로부터 스트림 얻기
컬렉션으로부터 스트림 얻기
public class Product{
private int pno;
private String name;
public Product(int pno, String name){
this.pno = pno;
this.name = name;
}
@Override
public String toString(){
return new StringBuilder()
.append("{")
.append("pno : " +pno+", ")
.append("name: " + name + ", ")
.append("}")
.toString();
}
}
public class StreamExample{
public static void main(String[] args){
List<Product> list = new ArrayList<>();
for( int i =1; i<=5; i++){
list.add(new Product(i, "상품"+i);
}
Stream<Product> stream = list.stream();
stream.forEach(p->System.out.prinln(p));
}
}
배열로부터 스트림 얻기
java.uti.Arrays 클래스 이용
public class StreamExample{
public void main(String[] args){
String[] strArray = {"홍길동", "김준규", "이다빈"};
Stream<String> strStream = Arrays.stream(strArray);
strStream.forEach(item -> System.out.print(item+ ", "));
System.out.println();
int[] intArr = {1,2,3,4,5};
IntStream intStream = Arrays.stream(intArr);
intStream.forEach(item -> System.out.print(item+", "));
}
}
요소 걸러내기(필터링)
리턴 타입 | 메소드(매개변수) | 설명 |
Stream IntStream LongStream DoubleStream |
distinct() | - 중복제거 |
filter() | - 조건 필터링 - 매개 타입을 요소 타입에 따른 함수형 인터페이스이므로 람다식으로 작성 가능 |
요소 변환(매핑)
mapXxxx사용.
mapXxx의 매개변수의 타입인 Function은 매개값을 리턴값으로 벼환하는 함수형 인터페이스로 applyXxx() 추상메소드가 있다.
Studentlist.stream()
.mapToInt(s->s.getScore())
.forEach(score -> System.out.prinln(score));
요소 정렬
Comparable 구현 객체의 정렬
public class Xxx implements Comparable {
...
}
List<Xxx> list = new ArrayList<>();
Stream<Xxx> stream = list.stream();
Stream<Xxx> orderedStream = stream.sorted();
//객체가 Comparable을 구현하고 있어야 sorted()메소드를 사용해 정렬할 수 있다.
//역으로 정렬
Stream<Xxx> reverseOrderedStream = stream.sorted(Comparator.reverseOrder());
Comparator를 이용한 정렬
sorted((o1,o2)-> {...})
- o1이 o2보다 작으면 음수, 같으면 0, 크면 양수를 리턴한다
요소를 하나씩 처리(루핑)
리턴 타입 | 메소드 | 설명 |
XxxStream | peek | 반복 |
void | forEach | 반복 |
728x90
반응형
LIST
'IT > JAVA' 카테고리의 다른 글
[JAVA] #19 데이터베이스 입출력(게시판 프로그램) (1) | 2023.05.02 |
---|---|
[JAVA] #18 입출력 스트림 (0) | 2023.05.01 |
[JAVA] #16 람다식 (0) | 2023.04.27 |
[JAVA] #15 컬렉션 자료구조 (0) | 2023.04.27 |
[JAVA] #14 멀티 스레드 (0) | 2023.04.26 |