使用常规JAVA流收集int数组的值

时间:2019-03-24 07:47:50

标签: java arrays java-8 java-stream

在我的程序中,我试图使用流打印排序的int数组。但是在使用普通流时出现错误输出。并且在使用int流时会打印正确的详细信息。

请参阅下面的核心代码片段以获取更多详细信息。

package com.test.sort.bubblesort;

import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class BubbleSortWithRecursion {

    public static void bubbleSort(int[] arr, int n) {

        if (n < 2) {
            return;
        }

        int prevValue;
        int nextValue;
        for (int index = 0; index < n-1; index++) {
            prevValue = arr[index];
            nextValue = arr[index+1];

            if  (prevValue > nextValue) {
                arr[index] = nextValue;
                arr[index+1] = prevValue;
            }
        }

        bubbleSort(arr, n-1);
    }

    public static void main(String[] args) {
        int arr[] = new int[] {10,1,56,8,78,0,12};
        bubbleSort(arr, arr.length);

        **//False Output** :  [I@776ec8df
        String output = Arrays.asList(arr)
            .stream()
            .map(x -> String.valueOf(x))
            .collect(Collectors.joining(","));

        System.out.println(output);

        //Correct Output : 0,1,8,10,12,56,78
        String output2 = IntStream
            .of(arr)
            .boxed()
            .map(x -> Integer.toString(x))
            .collect(Collectors.joining(","));

        System.out.println(output2);

    }


}

我在控制台上得到以下输出:

[I@776ec8df
0,1,8,10,12,56,78

第一行输出是使用不正确的普通java流生成的。

为什么使用普通的JAVA流会得到虚假内容?我在这里想念什么吗?

3 个答案:

答案 0 :(得分:8)

您可以像这样解决您的问题:

String output = Arrays.stream(arr)
        .boxed()
        .map(String::valueOf)
        .collect(Collectors.joining(",")); // 0,1,8,10,12,56,78

说明发生了什么事:

使用Arrays.asList()时,外观如下:

public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

使用了T类型的varargs,在您的情况下,您将其用于int[]对象,因此Arrays.asList()将返回List中的int[]而不是整数流,因此您必须使用Arrays.stream,它看起来像这样:

public static IntStream stream(int[] array) {
    return stream(array, 0, array.length);
}

获取正确的数据。

答案 1 :(得分:7)

Arrays.asList(arr)返回唯一元素为List<int[]>的{​​{1}}。因此,流式传输arr并将该单个元素映射到List并使用String.valueOf(x)进行收集将得到一个Collectors.joining(","),其值为该单个数组的String,是您看到的输出。

toString()

String output = Arrays.asList(arr) // List<int[]> .stream() // Stream<int[]> .map(x -> String.valueOf(x)) // Stream<String> having a single element - "[I@776ec8df" .collect(Collectors.joining(",")); // "[I@776ec8df" 数组创建IntStream时,会得到单个元素的流(int值),因此可以将它们装箱,然后转换为{{ 1}} s,然后加入它们以获得所需的输出。

如果进行更改,则可以使第一个代码段生效:

int

收件人:

String

因为这种方式int arr[] = new int[] {10,1,56,8,78,0,12}; 将产生一个Integer arr[] = new Integer[] {10,1,56,8,78,0,12}; ,其中包含输入数组的所有元素。

答案 2 :(得分:0)

您可以做的更短:

String output = Arrays.stream(arr)
        .mapToObj(String::valueOf)
        .collect(Collectors.joining(","));

结果为0,1,8,10,12,56,78

首先创建一个IntStream,然后得到一个Stream<String>,它被收集到最后的String