느리더라도 꾸준히

[Stream]map() 그리고 mapToInt(); 본문

Java

[Stream]map() 그리고 mapToInt();

테디규 2022. 11. 20. 03:01

문제상황

public class Solution { 
  public int findLongestLength(String[] strArr) {
    //TODO..
    if(strArr.length==0) return 0;
    else return Arrays.stream(strArr) // String 요소를 가진 Stream
                      .map(s -> s.length()) 
                      .max()
                      .getAsInt();
  }
}
 error: method max in interface Stream<T> cannot be applied to given types;

정리

  1. Stream 은 들어오는 요소의 타입에 따라 여러가지 인터페이스로 사용될 수 있다.
  2. 람다식을 사용하는 스트림의 메서드들은 위의 인터페이스마다 각각 구현된 메서드의 모양이 다르다. 그러므로 적절한 매개변수와 리턴값을 알고 있어야한다.
    • 그냥 오버로딩 되어있다고 생각하지 말자. 인터페이스마다 구현 메서드가 다른 모양이다..!
    • mapToInt()는 지네릭 Stream인 Stream<T> 을 IntStream으로 바꾸어주는 메서드이다.

본문

해당 문제는 map 대신 mapToInt()를 사용하면 해결 할수 있었다.

public class Solution { 
  public int findLongestLength(String[] strArr) {
    //TODO..
    if(strArr.length==0) return 0;
    else return Arrays.stream(strArr) // String 요소를 가진 Stream
                      .mapToInt(s -> s.length()) 
                      .max()
                      .getAsInt();
  }
}

근데 왜 map()은 불가능 하고 mapToInt()는 가능한 걸까?

java.util.stream

위 문제의 해답은 바로 stream의 종류가 다르기 때문이다. stream 패키지를 가보면 아래 그림 처럼 여러 종류의 Stream 들이 인터페이스로 존재한다.

위 예시는 String을 사용하므로 Stream<T> 인터페이스를 사용할 것이다.

map()

Stream<T> 인터페이스에서 map() 과 max는 다음과 같다.

<R> Stream<R>    map(Function<? super T,? extends R> mapper)
Optional<T>    max(Comparator<? super T> comparator)

우리의 경우 String이므로 map은 Stream<String> 을 출력한다. 이 값을 사용하는 max는 매개변수로 Comparator가 있어야한다. 이 매개변수는 특정하게 바꿀 이유가 없다면 아래처럼 입력해 줄수 있다.

    public int findLongestLength(String[] strArr) {
        //TODO..
        if(strArr.length==0) return 0;
        else return Arrays.stream(strArr) // String 요소를 가진 Stream
                .map(s -> s.length())
                .max(Comparator.comparing(x->x))
                .get();
    }

mapToInt()

IntStream mapToInt(ToIntFunction<? super T> mapper)
OptionalInt    max()

mapToInt의 반환형은 IntStream interface의 구현체이고, 이때의 max()는 매개변수를 필요로 하지않는다.

Comments