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
댓글
댓글 쓰기