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