Java8 Stream 가이드

Java8 Stream 가이드

1. 개요

Java 8의 새로운 기능 Stream에 대해 설명합니다.

2. Stream API

Java 8의 주요 새로운 기능 중 하나는 여러가지 요소(element) 처리를 위한 매우 강력한 스트림 기능인 java.util.stream 입니다 .
클래스는 Stream 이며, T 타입 기반의 Stream을 다양한 방법으로 생성할 수 있습니다.

2.1. Stream 생성

stream () 및 of () 메소드를 사용하여 콜렉션 또는 배열과 같은 다른 요소 소스에서 스트림을 작성

String[] arr = new String[]{"a", "b", "c"};
Stream<String> stream = Arrays.stream(arr);
stream = Stream.of("a", "b", "c");

stream 을 생성하는 쉬운 방법은 컬렉션 인터페이스를 통해 생성할 수 있습니다.

Stream<String> stream = list.stream();

2.2. 멀티쓰레딩 Streams

stream API는 또한 스트림 요소에서 병렬 모드로 작업을 실행 하는 parallelStream() 메서드를 제공하여 멀티 스레딩을 단순화 합니다.
아래 코드 는 스트림의 모든 요소에 대해 doWork () 메소드 를 병렬 로 실행할 수 있도록 합니다

list.parallelStream().forEach(element -> doWork(element));

3. Stream 사용법

스트림에서 제공하는 함수는 크게 중간 작업 (return Stream, self-return )과 연산작업 (특정 타입으로 return ) 으로 나뉩니다.

long count = list.stream().distinct().count();

distinct() 메서드는 이전 스트림에서 중복을 제거한 새로운 스트림을 만드는 중간 작업이고, count()는 스트림 크기를 리턴합니다.

3.1. 반복(loop)

Stream 의 foreach는 while/for 루프 를 대체하며, 별도 index 없이 반복작업만 수행 할 수 있습니다.

for (String string : list) {
    if (string.contains("a")) {
        return true;
    }
}

위의 for loop를 Stream으로 변경하면

boolean isExist = list.stream().anyMatch(element -> element.contains("a"));

3.2. 필터링(filter)

filter() 메소드는 특정 조건을 만족하는 스트림의 요소를 선별할 수 있습니다.

ArrayList<String> list = new ArrayList<>();
list.add("One");
list.add("OneAndOnly");
list.add("Derek");
list.add("Change");
list.add("factory");
list.add("justBefore");
list.add("Italy");
list.add("Italy");
list.add("Thursday");
list.add("");
list.add("");

List 의 Stream 을 만들고 char “d” 가 포함 된 문자열만 필터링하여 새로운 Stream을 생성

Stream<String> stream = list.stream().filter(element -> element.contains("d"));

3.3. 변환(map)

map () 메서드를 사용하여 Stream의 요소를 새로운 요소로 변환할 수 있습니다.

List<String> uris = new ArrayList<>();
uris.add("C:\\My.txt");
Stream<Path> stream = uris.stream().map(uri -> Paths.get(uri));

위 코드는 모든 요소에 특정 람다 식을 적용하여 Stream 을 Stream 로 변환하여 리턴합니다.
모든 요소에 고유한 요소 시퀀스가 ​​포함 된 스트림이 있고 이러한 내부 요소의 스트림을 작성하려면 flatMap () 메소드를 사용해야합니다 .

List<Detail> details = new ArrayList<>();
details.add(new Detail());
Stream<String> stream
  = details.stream().flatMap(detail -> detail.getParts().stream());

이 예에서는 Detail 유형의 요소 목록이 있습니다 . 상세 클래스는 필드가 들어 부품, A는 목록 <문자열>. flatMap () 메소드 의 도움으로 PARTS 필드의 모든 요소 가 추출되어 새로운 결과 스트림에 추가됩니다. 그 후 초기 Stream 이 손실됩니다 .

3.4. 매칭(match)

스트림 요소에 대해 유효성 검증을 수행할 수 있습니다. 이를 수행하려면 anyMatch(), allMatch(), noneMatch() 메소드를 사용하면 됩니다.

boolean isValid = list.stream().anyMatch(element -> element.contains("h")); // true
boolean isValidOne = list.stream().allMatch(element -> element.contains("h")); // false
boolean isValidTwo = list.stream().noneMatch(element -> element.contains("h")); // false

3.5. 축소(Reduction)

Stream 요소를 순차적으로 순회하여 데이터를 누적 할 수 있도록 reduce() 메소드를 제공합니다. 첫번째(시작값), 두번째(누적값) 2개의 파라메터를 사용합니다.
따라서 다음 코드를 실행할 수 있으며 결과는 26 (23 + 1 + 1 + 1)입니다.

List<Integer> integers = Arrays.asList(1, 1, 1);
Integer reduced = integers.stream().reduce(23, (a, b) -> a + b);

3.6. 수집(collect)

collect() 모든 요소를 특정 타입으로 수집??(축소)하여 리턴합니다.

List<String> resultList 
  = list.stream().map(element -> element.toUpperCase()).collect(Collectors.toList());

위 코드는 collect () 작업을 사용하여 Stream 을 List으로 변환합니다.

4. 결론

여기에서는 Java 스트림에 대해 간략히 살펴 보았습니다. JPA 결합하여 사용하면 복잡한 쿼리를 단순하게 하여 코드로 처리할 수 있습니다.

작성자 : eyebora32
참조 : https://www.baeldung.com/java-8-streams
Written with StackEdit

댓글

주간 인기글

남산 케이블카 이야기

Kotlin, Java 그 다음?

[정보] 인스타그램은 당신의 소리를 '듣고' 있을 수도 있습니다

[Angular] 모델, 값이 바뀌었는데 화면 template 이 업데이트 되지 않을 때 조치 팁

안드로이드에서 당겨서 새로고침(SwipeRefreshLayout) 쉽게 구현하기