예를들어서 String 타입의 값이 aAb1B2cC34oOp의 값을 갖고 있는 아래의 변수가 존재한다고 가정 했을때 정수 부분만 출력하고 싶을 때 어떻게 해야하는지 공부해보 았습니다.

String str = "aAb1B2cC34oOp";

1. 내가 했던 방법

String.replaceAll()을 사용한 정규식 사용방법

String my_string ="aAb1B2cC34oOp";
String[] strArr = my_string.replaceAll("[^0-9]" , "").split("");

int answer = 0;

for(String s : strArr) {
	answer += Integer.parseInt(s);
}

System.out.println(answer); //10
  • 단순히 정규식을 사용하여 0-9를 제외한 숫자는 ""로 치환하는 메서드를 사용한 후 , split("") 으로 String[] 타입의 배열을 만들었습니다.

2. stream 을 사용해서 해결

 int sum = my_string.chars()
 				.mapToObj(i -> (char) i)
				.filter(ch -> Character.isDigit(ch))
                .map(obj -> String.valueOf(obj))
                .mapToInt(s -> Integer.valueOf(s)).sum();
                
System.out.println(sum); // 10;

// 최종연산collect를 사용해서 joining 사용해봄
String result = my_string.chars()
				.mapToObj(i -> (char) i).filter(ch -> Character.isDigit(ch))
                .map(obj -> String.valueOf(obj))
                .mapToInt(s -> Integer.valueOf(s))
                .mapToObj(String::valueOf)
                .collect(Collectors.joining(",", "<", ">"));
System.out.println(result); //<1,2,3,4>
                

1) mapToInt 메서드

일반 스트림에서는 map 메서드와 다르게 ToIntFunction<? super T> mapper를 파라미터로 전달합니다.

  • ToIntFunction라는 인터페이스의 이름에서 알 수 있듯이 기본 Function<T,R> 에서 T만 제네릭 타입으로 전달받고 R은 int로 정해져있습니다.

2) mapToObj() 메서드

mapToInt()와 다르게 기본형 특화 스트림으로 Stream으로 변환해주는 메서드 입니다.

  • 기본형 특화스트림의 종류에 따라 LongFunction<U>,DoubleFunction<U>를 파라미터로 받습니다.
  • 인터페이스 이름에서 알 수 있듯이 Function<T,R>에서 T 가int,long,double 이고, R 이 U가 됩니다.
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글

Powered by GraphCDN, the GraphQL CDN