매핑


매핑(mapping)은 중간 처리 기능으로 스트림의 요소를 다른 요소로 대체하는 작업을 말한다. 스트림에서 제공하는 매핑 메소든튼 flatXXX() 와 mapXXX (), 그리고 asDoubleStream(), asLongStream(), boxed()가 있다.



1. flatMapXXX() 메소드


flatMapXXX() 메소드는 요소를 대체하는 복수 개의 요소들로 구성된 새로운 스트림을 리턴한다. 다음 그림을 보면서 이해해보자. 스트림에서 A라는 요소는 A1, A2 요소로 대체되고, B라는 요소는 B1, B2 로 대체된다고 가정했을 경우, A1, A2, B1, B2 요소를 가지는 새로운 스트림이 생성된다.



flatMapXXX() 메소드의 종류는 다음과 같다.


리턴 타입 메소드(매개 변수) 요소 -> 대체요소
Stream<R> flatMap(Function<T,Stream<R>>) T -> Stream<R>
DoubleStream flatMap(DoubleFunction<DoubleStream>) double -> DoubleStream
IntStream flatMap(IntFunction<IntStream>) int -> IntStream
LongStream flatMap(LongFunction<LongStream>) long -> LongStream
DoubleStream flatMapToDouble(Function<T, DoubleStream>) T -> DoubleStream
IntStream flatMapToInt(Function<T, IntStream>) T -> IntStream
LongStream flatMapToLong(Function<T, LongStream>) T -> LongStream


import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;

public class FlatMapExample {
  public static void main(String[] args){
    List<String> inputList1 = Arrays.asList("java8 lambda", "stream mapping");

    inputList1.stream()
      .flatMap(data -> Arrays.stream(data.split(" ")))
      .forEach(word -> System.out.println(word));

    System.out.println();

    List<String> inputList2 = Arrays.asList("10, 20, 30", "40, 50, 60");
    inputList2.stream()
      .flatMapToInt(data -> {
        Strin[] strArr = data.split(",");
        int[] intArr = new int[strArr.length];
        fot(int i = 0; i < strArr.length; i++){
          intArr[i] = Integer.parseInt(strArr[i].trim());
        }
        return Arrays.stream(intArr);
      })
      .forEach(number -> System.out.println(number));
  }
}



2. mapXXX() 메소드


mapXXX() 메소드는 요소를 대체하는 요소로 구성된 새로운 스트림을 리턴한다. 스트림에서 A요소는 C요소로 대체되고, B 요소는 D 요소로 대체 된다고 했을 경우, C, D 요소를 가지는 새로운 스트림이 생성된다.




리턴 타입 메소드(매개 변수) 요소 -> 대체 요소
Stream<R> map(Function<T, R>) T -> R
DoubleStream mapToDouble(ToDoubleFunction<T>) T -< double
IntStream mapToInt(ToIntFunction<T>) T -> int
LongStream mapToLong(ToLongFunction<T>) T -> long
DoubleStream map(DoubleUnaryOperator) double -> double
IntStream mapToInt(DoubleToIntFunction) double -> int
LongStream mapToLong(DoubleToLongFunction) double -> long
Stream<U> mapToObj(DoubleFunction<U>) double -> U
IntStream map(IntUnaryOperator) int -> int
DoubleStream mapToLong(IntToDoubleFunction) int -> double
LongStream mapToLong(IntToLongFunction) int -> long
Stream<U> mapToObj(intFunction<U>) int -> U
LongStream map(LongUnaryOperator) long -> long
DoubleStream mapToDouble(LongToDoubleFunction) long -> double
IntStream mapToInt(LongToIntFunction) long -> int
Stream<U> mapToObj(LongFunction<U>) long -> U


public class Student{
  private String name;
  private int score;

  public Student(String name, int score){
    this.name = name;
    this.score = score;
  }

  public String getName(){return name;}
  public int getScore(){return score;}
}
import java.util.Arrays;
import java.util.List;

public class MapExample {
  public static void main(String[] args){
    List<Student> studentList = Arrays.asList(
      new Student("홍길동", 10),
      new Student("고길동", 20),
      new Student("김길동", 30)
    );

    studentList.stream()
      .mapToInt(Student:: getScore)
      .forEache(score -> System.out.println(score));
  }
}



3. asDoubleStream(), asLongStream(), boxed() 메소드


asDoubleStream() 메소드는 IntStream의 int 요소 또는 LongStream 의 long 요소를 double 요소로 타입 변환해서 DoubleStream을 생성한다. 마찬가지로 asLongStream() 메소드는 IntStream의 int 요소로 타입 변환해서 LongStream 을 생성한다. boxed() 메소드는 int, long, double 요소를 Integer, Long, Double 요소로 박싱해서 Stream을 생성한다.


리턴 타입 메소드(매개 변수) 설명
DoubleStream asDoubleStream() int -< double
long -< double
LongStream asLongStream() int -< long
Stream<Integer>
Stream<Long>
Stream<Double>
boxed() int -> Integer
long -> Long
double -> Double



import java.util.Arrays;
import java.util.Stream.IntStream;

public class AsDoubleStreamAndBoxedExample {
  public static void main(String[] args){
    int[] intArray = {1,2,3,4,5};

    IntStream intStream = Arrays.stream(intArray);
    intStream
      .asDoubleStream()
      .forEach(d -> System.out.println(d));

    System.out.println();

    intStream = Arrays.stream(intArray);
    intStream
      .boxed()
      .forEach(obj -> System.out.prinln(obj.intValue()));
  }
}