본문 바로가기
Language/JAVA

[JAVA] 스트림(Stream) 연산

by 바까 2020. 7. 2.
반응형

스트림(Stream)

✔자료의 대상과 관계없이 동일한 연산을 수행

     - 배열, 컬렉션을 대상으로 동일한 연산을 수행

     -일관성 있는 연산으로 자료의 처리를 쉽고 간단하게 한다.

한번 생성하고 사용한 스트림은 재사용할 수 없다.

    -자료에 대한 스트림을 생성하여 연산을 수행하며 스트림은 소모된다.

    -다른 연산을 위해서는 기존 자료를 변경하지 않는다.

스트림 연산은 기존 자료를 변경하지 않는다.

    -자료에 대한 스트림을 생성하면 별도의 메모리 공간을 사용하므로 기존 자료를 변경하지 않는다.

스트림 연산을 중간 연산과 최종 연산으로 구분된다.

    - 스트림에 대한 중간 연산은 여러개 적용될 수 있지만 최종 연산은 마지막에 한번만 적용된다.

    -최종연산이 호출되어야 중간 연산의 결과가 모두 적용된다. -> 지연 연산


스트림 연산 - 중간 연산

 

중간 연산 - filter(), map()

-조건에 맞는 요소를 추출(filter())하거나 요소를 변환(map())

예시) 문자열의 길이가 5이상이 요소만 출력하기

예시) 고객 클래스에서 고객 이름만 가져오기

 

 

 

스트림 연산 - 최종연산

 

forEach(),count(), sum(), reduce()

- 스트림의 자료를 소모하면서 연산은 수행한다.

- 최종 연산 후에 스트림은 더 이상 다른 연산을 적용할 수 없다.

forEach() : 요소의 개수

count(): 요소의 개수

sum(): 요소의 합

 


[실습] 정수형 배열에서 스트림 실행하기

import java.util.Arrays;//임폴트 자동추가

public class IntArrayTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//정수형 배열 선언 및 초기화
		int[] arr = {1,2,3,4,5};
		
		//sum() 연산으로 arr 배열에 저장된 값 모두 더하기
		int sumValue = Arrays.stream(arr).sum();
		System.out.println(sumValue);
        
        //count() 연산으로 arr 배열의 요소 개수를 반환
		//Type mismatch: cannot convert from long to int 타입 오류 
		//int count = Arrays.stream(arr).count();
		int count = (int)Arrays.stream(arr).count();//(int)로 형변환
		System.out.println(count);
	}

}

[실습] ArrayList에서 스트림 실행하기

 

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class ArrayListSteamTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//strList 객체 생성
		List<String> strList = new ArrayList<String>();
		strList.add("Ryan");
		strList.add("Apeach");
		strList.add("Muzi");
		
		//스트림을 생성
		Stream<String> stream = strList.stream();
		//배열의 요소를 하나씩 출력
		stream.forEach(s -> System.out.println(s));
		System.out.println();//개행
		
		//정렬
		strList.stream().sorted().forEach(s->System.out.println(s));//오름차순
	}

}


reduce() 연산

 

정의된 연산이 아닌 프로그래머가 직접 지정하는 연산을 적용

최종 연산으로 스트림의 요소를 소모하여 연산을 수행

 

예시) 배열의 모든 요소의 합을 구하는 reduce 연산

 

[실습] reduce()연산 - 가장 긴 문자열 찾기

import java.util.Arrays;
import java.util.function.BinaryOperator;
//BinaryOperator를 구현한 클래스를 정의
class CompareString implements BinaryOperator<String>{

	@Override
	public String apply(String t, String u) {
		// TODO Auto-generated method stub
		
		//reduce() 메서드가 호출될 때 불리는 메서드
		//두 문자열의 길이를 비교
		if(t.getBytes().length >= u.getBytes().length)
			return t;
		else
			return u;
	}
	
}

public class ReduceTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
			String[] lang= {"HTML5","JavaScript","jQuery","Oracle","JAVA"};
			
			//(1)
			System.out.println(Arrays.stream(lang).reduce("",(s1,s2) -> {//""는 초기값
				if(s1.getBytes().length >= s2.getBytes().length)
					return s1;
				else
					return s2;
			
			}));
			
			//(2)
			String str = Arrays.stream(lang).reduce(new CompareString()).get();
			System.out.println(str);
	}

}


 

 

반응형

'Language > JAVA' 카테고리의 다른 글

[JAVA] 예외처리(try ~ catch)  (0) 2020.07.02
[JAVA]Stream - 여행객의 여행비용 계산하기  (0) 2020.07.02
[JAVA]Class 클래스  (0) 2020.07.01
[JAVA] 람다식(lambda expression)  (0) 2020.07.01
[JAVA]내부클래스  (0) 2020.07.01

댓글