IT

배열에서 스트리밍할 때 정수를 문자열에 매핑할 수 없는 이유는 무엇입니까?

itgroup 2022. 10. 29. 14:18
반응형

배열에서 스트리밍할 때 정수를 문자열에 매핑할 수 없는 이유는 무엇입니까?

이 코드는 동작합니다(Javadoc에서 취득).

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparatedNumbers = numbers.stream()
    .map(i -> i.toString())
    .collect(Collectors.joining(", "));

다음 항목을 컴파일할 수 없습니다.

int[] numbers = {1, 2, 3, 4};
String commaSeparatedNumbers = Arrays.stream(numbers)
    .map((Integer i) -> i.toString())
    .collect(Collectors.joining(", "));

IDEA에 따르면 "lambda expression에 호환되지 않는 반환 유형 문자열"이 있습니다.

왜? 어떻게 고칠 건데?

Arrays.stream(int[]) 창조하다IntStream 이에요.Stream<Integer>그러니까 그냥 전화하는 게 아니라map를 할 때,int오브젝트에 접속합니다.

이것은 예상대로 동작합니다.

String commaSeparatedNumbers = Arrays.stream(numbers)
    .mapToObj(i -> ((Integer) i).toString()) //i is an int, not an Integer
    .collect(Collectors.joining(", "));

다음과 같이 쓸 수도 있습니다.

String commaSeparatedNumbers = Arrays.stream(numbers)
    .mapToObj(Integer::toString)
    .collect(Collectors.joining(", "));

Arrays.stream(numbers) 창조하다IntStream IntStream에는 를필 an an an an an가 필요합니다.IntUnaryOperator(function, ( ( ()int -> int적용하려는 매핑 함수가 이 계약을 따르지 않아 컴파일 오류가 발생했습니다.

해야 할 것 요.boxed()「에」를 Stream<Integer>(이것)Arrays.asList(...).stream() 전화해 주세요.map첫 번째 토막에서처럼요.

는, 「」를 참조해 주세요.boxed()에 어 followed가 붙는다.map 이 글을 쓰는 게 거예요.mapToObj직접적으로.

은 ★★★★★입니다.mapToObj 1개씩 할 는 없어요.int을 ""로 합니다.Integer오브젝트: 물론 당신이 적용하는 매핑 기능에 따라 다르겠지만, 저는 쓰기에도 더 짧은 이 옵션을 사용합니다.

Arrays을 을 작성할 수 Arrays.stream(int[])을 호출하여 Integer Stream을 호출할 수 .mapToObjmapToObj(Integer::toString).

String csn = Arrays.stream(numbers) // your numbers array
.mapToObj(Integer::toString)
.collect(Collectors.joining(", "));

이게 도움이 됐으면 좋겠는데..

복싱, AFAIK 및 작은 문자열이 힙에 추가되지 않습니다.

public static void main(String[] args) {
    IntStream stream = IntStream.of(1, 2, 3, 4, 5, 6);
    String s = stream.collect(StringBuilder::new, (builder, n) -> builder.append(',').append(n), (x, y) -> x.append(',').append(y)).substring(1);
    System.out.println(s);
}

이 샘플과 질문의 목적이 스트링을 int 스트림에 매핑하는 방법(예를 들어 스트링 배열의 인덱스에 액세스하기 위해 int 스트림을 사용하는 방법)을 알아내는 경우 박스를 사용하여 int에 캐스팅할 수도 있습니다(그 후 배열 인덱스에 액세스할 수 있습니다).

int[] numbers = {0, 1, 2, 3}; 
String commaSeparatedNumbers = Arrays.stream(numbers)
    .boxed()
    .map((Integer i) -> Integer.toString((int)i))
    .collect(Collectors.joining(", "));

.boxed() 호출은 IntStream(원시 int의 스트림)을 스트림(Integer 객체의 스트림)으로 변환합니다.이 스트림은 람다에서 오브젝트(이 경우 String 객체)의 반환을 받아들입니다.여기에서는 데모용 숫자의 문자열 표현에 불과하지만 앞에서 설명한 문자열 배열의 요소처럼 모든 문자열 객체가 될 수도 있습니다.

다른 가능성을 제시하려고요프로그래밍에서는 항상 여러 가지 방법으로 작업을 수행할 수 있습니다.가능한 한 많은 정보를 얻은 후 성능 문제, 직관성, 코드의 명확성, 코딩 스타일에 대한 선호도 및 가장 자기 문서화를 염두에 두고 당면한 작업에 가장 적합한 것을 선택합니다.

해피 코딩!

:: 연산자 외에:

String numString = numbers.stream()
  .map(String::valueOf)
  .collect(Collectors.joining(", "));

이는 새로운 Java 버전에서는 중요할 수 있습니다.

언급URL : https://stackoverflow.com/questions/29028980/why-cant-i-map-integers-to-strings-when-streaming-from-an-array

반응형