Stream 이란? 자바에서 Java 8부터 지원되기 시작한 기능이다. 컬렉션에 저장되어 있는 엘리먼트들을 하나씩 순회하면서 처리할 수 있는 코드 패턴을 의미함. 람다식과 함께 사용되어 컬렉션에 들어있는 데이터에 대한 처리를 매우 간결한 표현으로 작성할 수 있다. 또 한 내부 반복자를 사용하기 때문에 병렬처리가 쉽다는 점이 있다.


ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c"));
list.stream()
    .filter("b"::equals)    
    .forEach(System.out::println);

스트림 사용법

스트림을 사용하려면 우선 스트림 객체를 생성해야한다.


List<String> list = Arrays.asList("a","b","c");
Stream<String> stream = list.stream();

자바 코드에서 자주 사용하는 컬렉션 객체들은 Stream() 메소드를 지원한다. 컬렉션 객체에서 stream() 메소드를 호출하면 스트림 객체를 생성할 수 있음.

스트림 생성 - 배열

배열의 경우 정적 메소드를 이용하면 됨.


String [] array = new String[] {"a","b","c"};

Stream<String> stream1 = Arrays.stream(array);
Stream<String> stream1 = Arrays.stream(array,1,3);
//인덱스 1포함 3제외

정적 메소드 'Arrays.stream()' 에 인자로 배열을 입력하면 배열을 순회하는 스트림 객체를 생성할 수 있음.

Arrays.stream() 메소드에 배열과 시작,종료인덱스를 인자로 주면 배열의 일부를 순회하는 스트림 객체를 만드는 것도 가능함(이 때, 종료 인덱스는 포함되지 않음)

스트림 생성 - 빌더


String<String> stream = Stream<String>builder()
							.add("사과")
                            .add("과자")
                            .add("새우깡")
                            .build();
                            

이렇게 만들어진 스트림 객체는 사과,과자,새우깡 순서로 문자열 데이터를 처리하게 됨

스트림 활용

나이가 30살 미만인 사람을 조회하는 코드를 작성해보자 (JAVA 7 환경)


public class Person {

	private String name;
	private Integer age;
}

List<Person> person = Array.asList(
	new Person("김씨", 35),
	new Person("최씨", 25),
    new Person("곽씨", 15),
    new Person("박씨", 22)
);

List<Person> youngboy = new ArrayList<>();
for(Person youngPerson : person) {
	if(youngPerson.getAge() < 30) {
    	youngboy.add(youngPerson);
        }
    }    

스트림 활용


List<People> people = Array.asList(
	new People("김씨",35),
    new People("최씨",25),
    new People("곽씨",15)
);

List<String> youngPeopleName = people.stream()
	.filter(c -> c.getAge() < 30) //30살 미만
    .sorted(c1,c2) -> c2.getAge().compareTo(c1.getAge())) 나이가 많은 순으로 정렬
    .map(People::getName) //이름 필터림
    .collect(Collectors.toList()); //결과 반환

System.out.println(youngPeopleName);

출력결과 : 최씨,곽씨

이렇게 stream을 사용하면 로직을 선언형으로 처리할 수 있고 앞서 람다를 이용해서 연산을 파이프 라인으로 연결해 사용하므로 훨씬 더 가독성이 좋은 코드를 구성할 수 있다.

스트림의 특징

  1. 선언형 : 더 간결하고 가독성이 좋아짐
  2. 코드 유연성이 좋아짐.
  3. 병렬구성으로 성능 상승

0개의 댓글

Powered by GraphCDN, the GraphQL CDN