Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 에러해결
- 롤중독
- JAVA기본
- 정리글 작성법
- 백엔드로드맵
- 시작 #꾸준히 #과하지않게
- 코드스테이츠 #
- 코딩테스트
- 회고록
- Java환경
- 회고 #주간회고
- 호스트주소 #Host주소
- mapstruct
- 인터넷 #ISP
- jvm
- 몰입학습 #몰입
- 회고
- 네트워크 기초
- 공부방식
- String
- Git #회고록
- WSL #Linux #ubuntu
- 글 foramt
- WSL2 #권한
- 피드백
- 사용자계정 #WSL2
- OOP
- 코드스테이츠 #회고록
- 회고록_코드스테이츠
- git #intellij
Archives
- Today
- Total
느리더라도 꾸준히
[Stream]map() 그리고 mapToInt(); 본문
문제상황
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;
정리
- Stream 은 들어오는 요소의 타입에 따라 여러가지 인터페이스로 사용될 수 있다.
- 람다식을 사용하는 스트림의 메서드들은 위의 인터페이스마다 각각 구현된 메서드의 모양이 다르다. 그러므로 적절한 매개변수와 리턴값을 알고 있어야한다.
- 그냥 오버로딩 되어있다고 생각하지 말자. 인터페이스마다 구현 메서드가 다른 모양이다..!
- 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()는 매개변수를 필요로 하지않는다.
'Java' 카테고리의 다른 글
[OOP]객체지향 프로그래밍(OOP) - (4) SRP(Single-Relationship Principle) (0) | 2022.11.20 |
---|---|
[Java기본]생성자와 필드의 초기화 시점 및 순서 (0) | 2022.11.20 |
[OOP]객체지향 프로그래밍(OOP) - (3) 캡슐화 (0) | 2022.11.17 |
[OOP]객체 지향 프로그래밍(OOP) - (2)추상화 & 다형성 & DI (2) | 2022.11.16 |
[OOP]객체 지향 프로그래밍(OOP) - (0)설계 (0) | 2022.11.16 |
Comments