앞서 Stream을 공부하였으니 이제는 적용을 해보도록 하겠습니다!
앞서 Stream을 공부한 기록은 여기 있습니다!👇
Stream을 부숴보자👊
Stream 적용해보기
EnumMap의 요소 초기화
for ( Winning winning : Winning . values ()) {
result . put ( winning , 0 );
}
Arrays . stream ( Winning . values ())
. forEach ( value -> result . put ( value , 0 ));
stream의 첫 사용이 아주 뿌듯합니다!!!
string을 int로 변환가능하다면 변환해서 list로 만들어주는 메소드
public List < Integer > stringToList ( String input ) throws IllegalArgumentException {
List < Integer > player = new ArrayList <>();
String [] numbers = input . split ( "," );
for ( String number : numbers ) {
int playerNumber = inputToInt ( number );
player . add ( playerNumber );
}
return player ;
}
public List < Integer > stringToList ( String input ) throws IllegalArgumentException {
return Arrays . stream ( input . split ( "," ))
. map ( this :: inputToInt )
. collect ( Collectors . toList ());
}
우선 input을 “,”로 잘라 Stream으로 만들어줍니다.
그리고 현재 객체의 inputToInt메소드를 통해 Stream로 매핑해줍니다.
그리고 List로 반환해줍니다.
이번 코드는 꽤나 간결하게 잘 만든 것 같습니다!
이번 코드를 만들면서는 꽤나 고생을 했는데 만들고 나니 너무 쉬워보여서 어이가 살짝 없는 느낌입니다…
원래의 코드는 input을 잘라서 String[]에 넣고 유효성 검사를 하여 List에 추가해준 뒤 List를 반환해주었습니다.
바뀐 코드는 input을 잘라서 Stream에 넣고 유효성 검사를 하여 Stream에 넣어준 뒤 List로 반환해주었습니다!
당첨 통계를 출력하는 메소드
public void printResult ( int purchasePrice ) {
int totalPrice = 0 ;
System . out . println ( "\n" + PrintOutput . RESURLT_LOTTO + "\n---" );
for ( Winning winning : Winning . values ()) {
totalPrice += winning . getWinningPrice () * result . get ( winning );
printMatch ( winning );
}
System . out . printf ( "총 수익률은 %,.1f%%입니다." , ( double ) totalPrice / purchasePrice * 100 );
}
여기서 for 문을 Arrays.stream으로 바꾸고 싶은데 아직은 도저히 방법이 생각나지 않습니다..
일치 갯수와 보너스 볼을 이용한 당첨 등수 반환 메소드
public static Winning result ( int matchNumber , int checkBonusBall ){
if ( matchNumber == SECOND . matchNumber && checkBonusBall == SECOND . checkBonusBall ){
return SECOND ;
}
for ( Winning winning : values ()){
if ( winning . matchNumber == matchNumber ){
return winning ;
}
}
return No_Match ;
}
public static Winning result ( int matchNumber , int checkBonusBall ){
if ( matchNumber == SECOND . matchNumber && checkBonusBall == SECOND . checkBonusBall ){
return SECOND ;
}
return Arrays . stream ( Winning . values ())
. filter ( winning -> winning . matchNumber == matchNumber )
. findAny ()
. orElse ( No_Match );
}
당첨 번호와 사용자의 로또 번호, 보너스 볼을 비교하는 메소드
private void matchResult ( List < Lotto > randomLottoNumbers , int bonusNumber ) {
for ( Lotto userLottoNumbers : randomLottoNumbers ) {
int [] matchNumber = winningNumbers . matchNumber ( userLottoNumbers , bonusNumber );
winningData . winningResult ( matchNumber [ 0 ], matchNumber [ 1 ]);
}
}
우선 userLottoNumbers를 Stream로 만들어주고 int배열로 mapping…?
정수 List를 받아 1~45까지 수인지 검사
private void number_check ( List < Integer > numbers ) {
for ( Integer number : numbers ) {
if ( number < MIN_NUMBER || number > MAX_NUMBER ) {
System . out . println ( "[ERROR] 로또 번호 1부터 45까지의 수로 입력해주세요.\n" );
throw new IllegalArgumentException ();
}
}
}
우선 stream에서 sout을 사용하는 방법과 예외를 던지는 방법을 찾아보자..
입력 받은 번호와 보너스 볼에 대해 일치하는 결과 반환
public int [] matchNumber ( Lotto lottoNumbers , int bonusBall ){
int [] matchResult = new int []{ 0 , 0 };
for ( int number : lottoNumbers . numbers ){
if ( numbers . contains ( number )){
matchResult [ 0 ] += 1 ;
}
}
if ( lottoNumbers . numbers . contains ( bonusBall )){
matchResult [ 1 ] = 1 ;
}
return matchResult ;
}
lottoNumbers.numbers를 stream으로 바꿔서 filter로 조건을 주고 count로 matchResult[0]에 저장
변경 후
matchResult [ 0 ] = ( int ) lottoNumbers . numbers . stream ()
. filter ( number -> numbers . contains ( number ))
. count ();
위 count의 반환 값이 long으로 반환되어 int로 캐스팅해줬습니다!
intellij가 numbers.contains(number)를 바꿀 수 있다고 하여 option + enter로 바꿔줬더니 아래와 같은 코드가 되었습니다!
matchResult [ 0 ] = ( int ) lottoNumbers . numbers . stream ()
. filter ( numbers: : contains )
. count ();
© 2024. All rights reserved.
김민제의 블로그