JAVA

스트림(Stream)

Stater 2019. 10. 15. 09:09

스트림(Stream)

(자바io스트림과는 다르다. 자료 연산을 위한 객체)

- 자료의 대상과 관계없이 동일한 연산을 수행할 수 있는 기능(자료의 추상화)

- 배열, 컬렉션에 동일한 연산이 수행되어 일관성 있는 처리 가능

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

- 스트림 연산은 기존 자료를 변경하지 않음

- 중간연산과 최종 연산으로 구분 됨

- 최종연산이 수행되어야 모든 연산이 적용되는 지연연산

 

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

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

 

문자열의 길이가 5이상인 요소만 출력하기(filter)

sList.stream().filter(s->s.length()>=5).forEach(s->System.out.println(s));

스트림생성   중간연산                   최종연산

 

고객 클래스에서 고객이름만 가져오기(map)

customerList.stream().map(c->c.getName()).forEach(s->System.out.println(s));

스트림 생성             중간연산                 최종연산

 

스트림 연산 - 최종연산

- 스트림의 자료를 소모하면서 연산을 수행

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

 forEach(): 요소를 하나씩 꺼내옴

 count(): 요소의 개수

 sum(): 요소의 합

이외에도 여러가지 최종 연산들이 존재.

 

연산을 위한 스트림 객체 코드

package stream;

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

public class ArrayListStreamTest {

	public static void main(String[] args) {
		
		List<String> sList = new ArrayList<String>();
		sList.add("Tomas");
		sList.add("Edward");
		sList.add("Jack");
		
		Stream<String> stream= sList.stream();
		stream.forEach(s->System.out.println(s));
		System.out.println();
		
		sList.stream().sorted().forEach(s->System.out.print(s+" "));
		System.out.println();
		sList.stream().map(s->s.length()).forEach(n->System.out.println(n));
	}

}
package stream;

import java.util.Arrays;

public class IntArrayTest {

	public static void main(String[] args) {
		
		int[] arr = {1,2,3,4,5};
		
		int sum=Arrays.stream(arr).sum();
		int count = (int)Arrays.stream(arr).count();

		System.out.println(sum);
		System.out.println(count);
	}

}

 

reduce() 연산

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

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

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

Arrays.stream(arr).reduce(0(초기값),(a,b)(전달되는요소)->a+b(각 요소가 수행해야할 기능);

 

두 번째 요소로 전달되는 람다식에 따라 다양한 기능을 수행

package stream;

import java.util.Arrays;

public class IntArrayTest {

	public static void main(String[] args) {
		
		int[] arr = {1,2,3,4,5};
		
		int sum=Arrays.stream(arr).sum();
		int count = (int)Arrays.stream(arr).count();

		System.out.println(sum);
		System.out.println(count);
		
		System.out.println(Arrays.stream(arr).reduce(0, (a,b)->a+b));
	}

}

 

 

 

 

제일 긴 문자 출력하기 

package stream;

import java.util.Arrays;

public class ReduceTest {

	public static void main(String[] args) {
		
		String[] greeting= {"안녕하세요~~~","hello","Good morning","반갑습니다."};
		
		System.out.println(Arrays.stream(greeting).reduce("", (s1,s2)->
		{
			if(s1.getBytes().length>=s2.getBytes().length)
				return s1;
			else return s2;
		}));

	}

}
반응형

'JAVA' 카테고리의 다른 글

예외처리  (0) 2019.10.17
스트림관련 코딩  (0) 2019.10.16
람다식  (0) 2019.10.14
내부클래스  (0) 2019.10.13
Map인터페이스  (2) 2019.10.12