내부 클래스, 람다식, 스트림 3

1. 스트림(stream)

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

  • 배열, 컬렉션을 대상으로 동일한 연산을 수행 함
  • 일관성 있는 연산으로 자료의 처리를 쉽고 간단하게 함

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

  • 자료에 대한 스트림을 생성하여 연산을 수행하면 스트림은 소모됨
  • 다른 연산을 위해서는 새로운 스트림을 생성해야 함

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

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

스트림 연산은 중간 연산과 최종 연산으로 구분됨

  • 스트림에 대해 중간 연산은 여러 개 적용될 수 있지만 최종 연산은 마치막에 한 번만 적용됨
  • 최종 연산이 호출되어야 중간 연산의 결과가 모두 적용됨 => 지연 연산

예시

public class IntArrayTest {
	public static void main(String[] args) {
		int[] arr = {1,2,3,4,5};
		
		//일반적인 스트림 사용
		int sum = Arrays.stream(arr).sum();
		System.out.println(sum); //15
		
		//한 번 생성하고 사용한 스트림은 재사용 할 수 없음
		IntStream stream = Arrays.stream(arr); //스트림 생성
		int sumStream = stream.sum(); //스트림 사용
		//int count = (int) stream.count(); //스트림 재사용으로 오류 발생
		int count = (int) Arrays.stream(arr).count(); //스트림 재생성하면 정상 작동
		System.out.println(sumStream); //15
		System.out.println(count); //5
	}
}
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class ArrayListTest {
	public static void main(String[] args) {
		List<String> sList = new ArrayList<String>();
		sList.add("Tomas");
		sList.add("james");
		sList.add("Edward");
		
		Stream<String> stream = sList.stream();
		stream.forEach(s -> System.out.println(s)); //Tomas james Edward
		
		sList.stream().sorted().forEach(s -> System.out.println(s)); //Edward Tomas james
		
		
	}
}

reduce() 연산

  • 정의된 연산이 아닌 프로그래머가 직접 지정하는 연산을 적용
  • 최종 연산으로 스트림의 요소를 소모하며 연산 수행
  • 배열의 모든 요소의 합을 구하는 reduce() 연산

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

reduce로 가장 긴 문자열 반환하기

import java.util.Arrays;
import java.util.function.BinaryOperator;

class CompareString implements BinaryOperator<String>{
	@Override
	public String apply(String s1, String s2) {
		if(s1.getBytes().length >= s2.getBytes().length)
			return s1;
		else return s2;
	}
}

public class ReduceTest {
	public static void main(String[] args) {
		String[] greeting = {"안녕하세요~~~~~~~~", "hello", "Good Moring", "반갑습니다"};
		
		//구현부를 만들어서 사용하기
		String str1 = Arrays.stream(greeting).reduce("", (s1, s2) ->{
			if(s1.getBytes().length >= s2.getBytes().length)
				return s1;
			else return s2;
		});
		System.out.println(str1);//안녕하세요~~~~~~~~
		
		//BinaryOperator로 구현부 만들기
		String str2 = Arrays.stream(greeting).reduce(new CompareString()).get();
		System.out.println(str2);//안녕하세요~~~~~~~~
	}
}

태그:

카테고리:

업데이트: