[Java] Java8, 스트림(Streams)

A java.util.Stream 클래스는 동일한 타입의, 다수의 데이터에 대해 다양한 연산을 빠르게 적용할 수 있는 기능을 제공합니다. 스트림은 java.util.Collection 객체로부터 생성되는데, 리스트나 집합 등이 그 예인데요. 맵은 지원하지 않습니다. 다음과 같은 리스트가 있다고 하고 이 리스트를 통해 스트림을 만들어 다양한, 유용한 연산의 예제 코드를 언급하겠습니다.

List stringCollection = new ArrayList<>();
		
stringCollection.add("신숙주");
stringCollection.add("김옥자");
stringCollection.add("조미현");		
stringCollection.add("송기숙");
stringCollection.add("최미라");
stringCollection.add("박미남");
stringCollection.add("김구라");
stringCollection.add("김형준");

filter

요소 중 ‘김’으로 시작하는 문자열을 걸러내어 화면에 표시합니다.

stringCollection
    .stream()
    .filter((s) -> s.startsWith("김"))
    .forEach(System.out::println);

sorted

요소를 정렬하고, 정렬된 리스트에 대해 ‘김’자로 시작하는 요소를 화면에 표시합니다.

stringCollection
    .stream()
    .sorted()
    .filter((s) -> s.startsWith("김"))
    .forEach(System.out::println);

map

요소 각각에 함수를 호출합니다. 아래는 각 요소의 뒤에 ‘씨’ 자를 붙이고 정렬한 후 출력합니다.

stringCollection
    .stream()
    .map((a) -> a + "씨")
    .sorted((a, b) -> b.compareTo(a))
    .forEach(System.out::println);

count

‘김’자로 시작하는 요소의 개수를 얻습니다.

long cntKim = stringCollection
    .stream()
    .filter((s) -> s.startsWith("김"))
    .count();

reduce

각 요소를 하나로 묶습니다.

Optional reduced = stringCollection
    .stream()
    .sorted()
    .reduce((s1, s2) -> s1 + "," + s2);

reduced.ifPresent(System.out::println);

anyMatch, allMatch, noneMatch

각 요소에 대해 지정한 조건에 부합하는지를 검사합니다. 첫번째인 anyMatch는 ‘김’으로 시작하는 요소가 하나라도 있다면 참입니다. 두번째인 allMatch는 모든 요소가 ‘김’으로 시작해야만 참입니다. 끝으로 세번째는 ‘고’로 시작하는 요소가 하나도 없어야 ‘참’입니다.

boolean anyStartsWithKim = stringCollection
    .stream()
    .anyMatch((s) -> s.startsWith("김"));

boolean allStartsWithKim = stringCollection
    .stream()
    .allMatch((s) -> s.startsWith("김"));

boolean noneStartsWithGo = stringCollection
    .stream()
    .noneMatch((s) -> s.startsWith("고"));

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다