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

+ Recent posts