자바 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));
정수 리스트의 각 요소에 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 + '\'' +
'}';
}
}
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);
String 스트림을 IntStream으로 바꾸고 IntStream에 있는 sum 메서드를 이용하여 합계를 구하는 코드입니다.
IntStream이나 LongStream도 Stream이기 때문에 Stream에 있는 여러 메서드들을 사용할 수 있습니다.