Today I Learned
(24.05.02)[3주차] Array의 스트림과 Optional을 활용 & 조건절과 예외
CODE KATA 정리
Array의 스트림과 Optional을 활용
더보기
import java.util.ArrayList;
import java.util.stream.*;
class Solution {
public int[] solution(int[] arr) {
int minIndex = 0;
ArrayList<Integer> answerlist = new ArrayList<>();
if(arr.length==1) {
answerlist.add(-1);
} else {
//Stream Optional을 이용해서배열의 최솟값 찾기
int min = IntStream.of(arr).min().getAsInt();
for(int i : arr){
if(i != min) {
answerlist.add(i);
}
}
}
// ArrayList 배열로변환
int[] answer = new int[answerlist.size()];
for(int i =0 ; i<answerlist.size(); i++) {
answer[i]=answerlist.get(i);
}
return answer;
}
}
- Stream의 최종연산인 min 메서드를 활용하여 최솟값을 구하는 방법 연습
- Stream을 사용하지 않을 경우에는 그냥 다중 for문을 활용해서 인데스값을 모두 서로 비교하는 로직을 사용해야-
순서
- Stream 만들기
- 컬렉션이 아닌 배열을 스트림으로 만들기 위해선느 Arrays.stream(배열) 또는 Stream.of(배열)
- 단! Stream.of를 사용하기 위해서는 int long double 타입일 경우 IntStream, LongStream, DoubleStream을 활용해야 당연히 import java.util.stream.IntStream; 도써줘야함
- Arrays.stream(배열)을 사용할 경우에는 Arrays클래스에서 가져오는 것이기 때문에 import java.util.Arrays; 사용
- 컬렉션이 아닌 배열을 스트림으로 만들기 위해선느 Arrays.stream(배열) 또는 Stream.of(배열)
- Stream 최종연산
- min() 메서드를 활용해서 스트림중 가장 작은 값을 반환하지만, stream의 min, max 메서드는 comparator를 매개변수로 받고 Optional<T> 타입으로 반환하는데, 여기에서는 IntStream 기본형 스트림에서 받아서 반환해야하 때문에 OptionalInt 타입으로 반환이 됨
- Optional
- getAsInt 메서드를 통해 OptionalInt 클래스로 묶여진 int값 즉 최솟값은 다시 int타입으로 빼내줄 수 있음
코멘트
- 처음 스스로 작성했을 때는 int min = IntStream.of(arr).min(); 까지 작성을 했기 때문에 계속 오류가 발생, min 메서드가 Optinal 타입으로 반환한다는 것을 공부할 때 잠깐 넘겼지 실제로 사용을 한적이 없기 때문에 이번에 일부러 실습을 하면서 익힐 수 있도록
과제 이슈
스트림과 람다식(메서드참조)을 활용
더보기
/**
* char operator 값을 받아 해당 OperatorType 반환 메서드
*
* @return OperatorType
* @parma char : operator
*/
public static OperatorType fromOperator(char operator) throws CalculationException { // 일단 초기화, enum은 새로운 객체생성 불가
for (OperatorType op : OperatorType.values()) { // 입력된 operator와 enum의 symbol을 비교
if (op.symbol == operator) { // enum에서 저장된 필드변수를 바로 불러올 수 있음 getter 필요 X
return op;
}
} // missing return 오류발생
}
이슈
- OperatorType enum 안의 fromOperator 메서드로, 매개변수로 들어온 char타입 변수와 enum의 symbol로 지정된 값을 비교해서 해당 상수를 반환하는 메서드
- 향상된 for문 안에 if조건절을 잘 맞춰주고 return값역시 OperatorType enum의 상수론 맞췄지만, missing return오류가 계속 발생
원인
- if의 조건절에서 boolean 타입이 false가 없을 경우, 즉, else를 사용해도 오류가 발생
- for 문을 돌면서 if절에서 반환하는 값이 정확하게 OperatorType이라고 확정을 지을 수 없음
- 조건에 부합하지 않는다면, 아무런 값도 반환하지 않고 종료되기 때문에 결론적으로 반환값이 아무것도 없음
- else를 상용해도, for문에서 또 아무런 값이 없다면 null을 반환
해결
- for문이 다 돌아도, 반환값이 없을 때, 강제로 예외를 발생시키게 하기위해서 예외를 발생한다면, 메서드가 정상적으로 닫힘
- 따라서, for문이 끝났을 때, 아래 예외발생문을 넣어서 아무것도 없을 때 메서드 자체에서 예외를 발생시키고 끝낸다는 의미
throw new CalculationException("잘못 입력된 연산기호 입니다.");
팀 과제가 시작이 되었느데 왜인지 모르게 git 설정부터 애를 먹고 있다. 진짜 화가난다.
'Today I Learned' 카테고리의 다른 글
(24.05.04)[3주차] WIL (0) | 2024.05.04 |
---|---|
(24.05.03)[3주차] 0/0 NaN , Stream -> List 변환 (0) | 2024.05.03 |
(24.05.01)[3주차] CODE KATA와 과제에서 스트림과 람다식(메서드참조)정리 (1) | 2024.05.01 |
(24.04.30)[3주차] 과제 이슈 정리 (0) | 2024.04.30 |
(24.04.29)[3주차] CODE KATA 이슈 정리(String에 char붙이기), 과제 이슈 정리(불필요 초기화 중복) (0) | 2024.04.29 |