Java Stream

수정이·2022년 4월 18일
0

JAVA

목록 보기
7/8
post-thumbnail

스트림(Stream)


  • 자바 8에서 추가한 스트림은 람다를 활용할 수 있는 기술 중 하나이다.
    스트림은 '데이터의 흐름'이다. 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합하여 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다.
  • 병렬처리가 가능하다. 즉, 쓰레드를 이용하여 많은 요소들을 빠르게 처리할 수 있다.
  • 한번 생성하고 사용한 스트림은 재사용 할 수 없다. 그러므로 다른 연산을 수행하기 위해서는 새로운 스트림을 생성해야한다.
  • 스트림 연산은 메모리 공간을 별도로 가지기 때문에 *기존 자료를 변경하지 않는다.8

스트림 생성하기


배열 스트림

  • 배열의 스트림을 생성하기 위해서는 Arrays.stream 메소드를 사용한다.
public static void main(String[] args) {

		int[] arr = {1, 2, 3, 4, 5};
		
		Arrays.stream(arr).forEach(s->System.out.print(s + " "));
	}
// 출력
1 2 3 4 5

컬렉션 스트림

컬렉션 타입(Collection, List, Set)의 스트림을 생성하기 위해서는 인터페이스에 추가된 디폴트 메소드인 stream을 사용한다.

public static void main(String[] args) {

		List<String> arr = new ArrayList<>();
		arr.add("Tomas");
		arr.add("Andy");
		arr.add("Luis");
		
		arr.stream().forEach(s->System.out.print(s + " "));
	}
// 출력
Tomas Andy Luis 

스트림의 중간 연산, 최종 연산


중간 연산

  • 중간 연산에는 filter(), map(), sorted() 등이 있다.
    • filter() : 스트림 내 요소들을 하나씩 평가해서 걸러내는 함수이다.
    • map() : 스트림 내 요소들을 하나씩 특정 값으로 변환하는 함수이다.
    • sorted() : 스트림 내 요소들을 정렬하는 함수이다. 기본은 오름차순 정렬이다.
  • 최종 연산이 호출될 때 중간 연산이 수행되고 결과가 생성 된다.
  • 중간 연산은 여러개를 사용해도 되지만, 최종 연산은 한 개만 사용가능하다.
public static void main(String[] args) {

		List<String> arr = new ArrayList<>();
		arr.add("Tomas");
		arr.add("Andy");
		arr.add("Luis");
		arr.add("Kang");
		arr.add("Lee");
		arr.add("Kim");
		
		arr.stream().sorted().forEach(name -> System.out.print(name + " "));
		System.out.println();
		arr.stream().sorted().map(s -> s.length()).forEach(name -> System.out.print(name + " "));
		System.out.println();
		arr.stream().sorted().filter(n -> n.length() > 4).forEach(name -> System.out.print(name));
	}
// 출력
Andy Kang Kim Lee Luis Tomas 
4 4 3 3 4 5 
Tomas 

최종 연산

  • 스트림이 관리하는 자료를 하나씩 소모해가며 연산이 수행 된다.
  • 최종 연산 후에 스트림은 더 이상 다른 연산을 적용할 수 없다.
  • 중간 연산에는 foreach(), sum(), count() 등이 있다.
    • foreach() : 스트림 내 요소들을 하나씩 꺼내 오는 함수이다.
    • sum() : 스트림 내 요소들을 하나씩 꺼내 와 더하는 함수이다.
    • count() : 스트림 내 요소들의 개수를 반환하는 함수이다.
public static void main(String[] args) {

		List<Integer> arr = new ArrayList<>();
		arr.add(11);
		arr.add(287);
		arr.add(3222);
		arr.add(4);
		arr.add(52);
		arr.add(100000);
		
		arr.stream().sorted().forEach(s -> System.out.print(s + " "));
		System.out.println();
		System.out.println(arr.stream().count());
        System.out.println(arr.stream().mapToInt(s->s.intValue()).sum());
	}
// 출력
4 11 52 287 3222 100000 
6
103576

참고


https://futurecreator.github.io/2018/08/26/java-8-streams/

0개의 댓글