stream

다량의 데이터 처리 작업을 돕고자 자바8에 스트림 API가 추가되었다. 이 API가 제공하는 추상 개념 중 핵심은 두 가지다. 스트림(stream)은 데이터 원소의 유한 혹은 무한 시퀀스(sequence)를 뜻한다. 스트림 파이프라인(stream pipleline)은 이 원소들로 수행하는 연산 단계를 표현하는 개념이다. 스트림 파이프라인 은 소스 스트림에서 시작해 종단 연산(terminal operation)으로 끝나며, 그 사이에 하나 이상의 중간 연산(intermediate operation)이 있을 수 있다. 각 중간 연산은 스트림을 어떠한 방식으로 변환(transform)한다. (중간 연산들은 모두 한 스트림을 다른 스트림으로 변환한다.) 또한 스트림 파이프라인은 지연 평가(lazy evaluat..
Stream을 이용한 2중 for문 우리는 2중 for문을 종종 사용해야할 때가 있다. Stream을 이용하여 2중 for문을 구현해보자. 상황 public static void main(String[] args) { List list1 = Arrays.asList("a", "b", "c", "d", "e"); List list2 = Arrays.asList("a", "b", "d"); // 2중 for문은 stream으로 어떻게 작성할까? // 만약 for문을 돌면서 같은 것만 list에 담고 싶다면? // 8버전 이전 List result1 = new ArrayList(); for(String str1 : list1){ for(String str2 : list2){ if(str1.equals(str2..
Stream API 에서는 커스텀하기 집계 결과물을 만드는 reduce()라는 메소드를 제공한다. (sum(), average(), count(), max(), min() 말고도 커스텀하게 사용할 경우 사용) Stream, IntStream, LongStream, DoubleStream 각 인터페이스에는 reduce() 메소드가 오버로딩 되어 있다. (매개타입 XXXOperator, 리턴 타입 OptionalXXX, int, long, double) 스트림 요소가 전혀 없을 경우 디폴트 값인 identity 매개값이 리턴된다. XXXOperator 매개값은 집계 처리를 위한 람다식 을 대입하는 곳이다. public static void main(String[] args){ List workerList =..
sum(), count(), average(), max(), min() 집계(Aggregate) 는 최종 처리 기능이며, 요소들을 처리한 후 카운팅, 합계, 평균값, 최대값, 최소값 등과 같이 하나의 값으로 산출하는 것을 말한다. => 대량의 데이터를 가공해서 축소하는 리덕션(Reduction)이라고 볼 수 있다. 스트림에서 제공하는 기본 집계 집계 메서드에서는 리턴 값으로 OptionalXXX클래스를 리턴한다. OptionalXXX는 자바8 java.util 패키지의 Optional, OptionalDouble, OptionalInt, OptionalLong 클래스타입을 말한다. (value-based class) 이 객체에서 값을 얻기 위해서는 get(), getAsDouble(), getAsInt(..
Stream API는 최종 처리 단계 특정 조건을 만족하는 요소들을 얻을 수 있도록 세가지 매칭 메소드를 제공한다. allMatch() 모든 요소들이 매개값(Predicate)으로 주어진 조건을 만족하는지 조사 anyMatch() 최소한 한 개의 요소가 주어진 조건에 만족하는지 조사 noneMatch() 모든 요소들이 주어진 조건을 만족하지 않는지 조사 public static void main(String[] args){ int[] intArr = {2, 4, 6}; boolean result = Arrays.stream(intArr) .allMatch(a -> a%2 == 0); System.out.println("2의 배수? " + result); result = Arrays.stream(intAr..
루핑(looping)은 요소 전체를 반복하는 것을 말한다. Stream API에서 루핑에 해당하는 메소드로는 peek, forEach가 존재한다. 이 둘의 차이점은 peek() 은 중간 처리 메소드이고, forEach()는 최종 처리 메소드라는 점이다. 기억해야할 점은, 중간 처리 메소드는 최종 처리 메소드가 실행되지 않으면 동작하지 않는다는 점이다. (예전 포스팅에도 적어놨음, 중간 처리 메소드는 최종 처리 메소드가 실행되기 전까지 지연(lazy) 됨) 따라서 peek()을 사용하고 최종 처리 메소드가 없으면 스트림은 동작하지 않게 된다. public static void main(String[] args){ int[] intArr = {1, 2, 3, 4, 5}; // 최종처리 메소드가 없으면 동작하..
요소가 최종 처리되기 전에 중간 단계에서 요소를 정렬해서 최종 처리 순서를 변경할 수 있다. sorted() => 객체의 Comparable 구현 방법에 따라 정렬 sorted(Comparator) => 객체를 주어진 Comparator에 따라 정렬 정렬과 관련해서 기존에 사용하고 있던 Worker 클래스를 변형하였다. Comparable 인터페이스를 구현하여, 나이(age)기준으로 오름차순으로 정렬할 수 있게 변경하였다. public class Worker implements Comparable{ private String name; private int age; public Worker(String name, int age) { super(); this.name = name; this.age = ag..
필터링은 중간 처리 기능으로 요소를 걸러내는 역할을 한다. distinct(), filter() 메소드는 모든 스트림이 가지고 있는 공통 메소드이다. distinct() 중복을 제거하는 메소드로, Object.equals(Object o)가 true일 경우 동일 객체로 판단하여 제거한다. filter(Predicate ...) 매개값으로 주어진 Predicate가 true를 리턴하는 요소만 필터링한다. public static void main(String[] args){ List names = Arrays.asList("강성현", "강성현", "깡냉", "강냉", "깡냉"); names.stream() .distinct() // 중복 제거 .forEach(System.out::println); Syst..
중간 처리와 최종 처리 스트림 은 데이터의 필터링, 매핑, 정렬, 그룹핑 등의 중간처리 와 합계, 평균, 카운팅, 최대값, 최소값 등의 최종 처리 를 파이프라인(pipelines)으로 해결한다. 스트림 = 중간처리 + 최종처리 로 구성 파이프라인 => 여러 개의 스트림이 연결되어 있는 구조를 말함 중간 스트림이 생성될 때 바로 요소들이 중간 처리되는 것이아니라, 최종 처리가 설정(시작)되기 전까지 중간처리는 지연된다. 최종처리가 시작되면 비로소 컬렉션 요소가 하나씩 중간 스트림에서 처리되고 최종 처리까지 오게된다. public static void main(String[] args){ List list = Arrays.asList( new Member("깡냉", Member.MALE, 30), new M..
스트림의 종류 자바8에 추가된 java.util.stream 패키지를 살펴보자 https://www.developer.com/java/data/stream-operations-supported-by-the-java-streams-api.html 모든 스트림에서 사용할 수 있는 공통 메소드들은 BaseStream에 정의되어 있으며, Stream은 객체 요소를 처리하는 스트림, IntStream, LongStream, DoubleStream은 각각 기본 타입인 int, long, double 요소를 처리하는 스트림이다. 1. 컬렉션으로부터 스트림 얻기 List list = Arrays.asList("가", "나", "다"); Stream stream = list.stream(); // Collection ...
깡냉쓰
'stream' 태그의 글 목록 (2 Page)