Study/java

[Java] Stream - map: 스트림 값 변환

 

자바 Stream의 map 메서드는 주어진 함수를 적용한 새로운 스트림을 만들어주는 메서드입니다.

 

map

map은 다음과 같이 사용합니다.

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);

list.stream().map(num -> num * 3).forEach(num -> System.out.println(num));

stream map 결과

정수 리스트의 각 요소에 3을 곱한 값으로 새로운 스트림을 만들었습니다.

map의 결과값은 Stream이기 때문에 map의 결과에 Stream 메서드를 또 사용할 수 있습니다.

 

또 다른 예로, 컬렉션의 타입을 바꾸고 싶을 때 사용하기도 합니다.

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);

List<String> stringList = list.stream().map(num -> num.toString()).collect(Collectors.toList());

Integer 리스트를 String 리스트로 바꾸는 코드입니다.

 

 

 

 

이 외에도 객체를 다른 객체로도 변경 가능합니다.

public static void main(String[] args) {
    List<Person> people = new ArrayList<>();
    people.add(new Person("Peter"));
    people.add(new Person("James"));
    people.add(new Person("Paul"));
    System.out.println("Before: " + people);

    List<String> names = people.stream().map(person -> person.getName()).collect(Collectors.toList());
    System.out.println("After: " + names);
}

public static class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" +
               "name='" + name + '\'' +
               '}';
    }
}

map을 사용하여 클래스 리스트를 문자열 리스트로 변환

 

mapToInt, mapToLong, mapToDouble

해당 메소드들은 지정된 타입의 Stream으로 만들어주는 메소드입니다.

Int는 IntStream, Long은 LongStream, Double은 DoubleStream을 반환합니다.

 

다음과 같이 사용할 수 있습니다.

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");

int sum = list.stream().mapToInt(value -> Integer.valueOf(value)).sum();
System.out.println("sum = " + sum);

mapToInt.sum 결과

String 스트림을 IntStream으로 바꾸고 IntStream에 있는 sum 메서드를 이용하여 합계를 구하는 코드입니다.

IntStream이나 LongStream도 Stream이기 때문에 Stream에 있는 여러 메서드들을 사용할 수 있습니다.