📜  Java中 Stream.of() 和 Arrays.stream() 方法的区别

📅  最后修改于: 2022-05-13 01:55:19.098000             🧑  作者: Mango

Java中 Stream.of() 和 Arrays.stream() 方法的区别

Arrays.stream()

Java中 Arrays 类stream(T[] array)方法用于从作为参数传递的数组及其元素中获取顺序流。它返回一个顺序流,其中包含作为参数传递的数组元素作为其源。

例子:

// Java program to demonstrate Arrays.stream() method
  
import java.util.*;
import java.util.stream.*;
  
class GFG {
    public static void main(String[] args)
    {
  
        // Creating a String array
        String[] arr = { "Geeks", "for", "Geeks" };
  
        // Using Arrays.stream() to convert
        // array into Stream
        Stream stream = Arrays.stream(arr);
  
        // Displaying elements in Stream
        stream.forEach(str -> System.out.print(str + " "));
    }
}

流.of()

Stream of(T... values)返回一个顺序有序的流,其元素是指定的值。 Stream.of() 方法只是为非原始类型调用 Arrays.stream() 方法。

例子:

// Java code for Stream of(T... values)
// to get a sequential ordered stream whose
// elements are the specified values.
  
import java.util.*;
import java.util.stream.Stream;
  
class GFG {
  
    // Driver code
    public static void main(String[] args)
    {
        // Creating an Stream
        Stream stream = Stream.of("Geeks", "for", "Geeks");
  
        // Displaying the sequential ordered stream
        stream.forEach(str -> System.out.print(str + " "));
    }
}

这两种方法是从指定数组创建顺序流的两种最常用的方法。当使用非原始类型 T 调用时,这两种方法都返回 Stream

Arrays.stream() 和 Stream.of() 的区别

即使 Stream.of() 是 Arrays.stream() 方法的包装器,也存在某些差异点,它们清楚地表明何时使用 Arrays.stream() 或何时使用 Stream.of()。以下是上述两种方法之间的一些区别:

  1. 不同的返回类型

    对于原始数组(如 int[]、long[] 等),Arrays.stream() 和 Stream.of() 具有不同的返回类型。

    示例:传递一个整数数组,Stream.of() 方法返回 Stream而 Arrays.stream() 返回一个 IntStream。

    // Java program to demonstrate return type
    // of Arrays.stream() and Stream.of() method
    // for primitive arrays
      
    import java.util.*;
    import java.util.stream.*;
      
    class GFG {
      
        public static void main(String[] args)
        {
            // Creating an integer array
            int arr[] = { 1, 2, 3, 4, 5 };
      
            // --------- Using Arrays.stream() ---------
      
            // to convert int array into Stream
            IntStream intStream = Arrays.stream(arr);
      
            // Displaying elements in Stream
            intStream.forEach(str -> System.out.print(str + " "));
      
            // --------- Using Stream.of() ---------
      
            // to convert int array into Stream
            Stream stream = Stream.of(arr);
      
            // Displaying elements in Stream
            stream.forEach(str -> System.out.print(str + " "));
        }
    }
    
  2. Stream.of() 需要展平,而 Arrays.stream() 不需要

    用于处理原始类型流的理想类是它们的原始流类型(如 IntStream、LongStream 等)。因此 Stream.of() 需要在消费之前显式展平为其原始 Stream。

    例子:

    // Java program to demonstrate need of flattenning
    // Stream.of() method returned type for primitive arrays
      
    import java.util.*;
    import java.util.stream.*;
      
    class GFG {
      
        public static void main(String[] args)
        {
            // Creating an integer array
            int arr[] = { 1, 2, 3, 4, 5 };
      
            // --------- Using Arrays.stream() ---------
      
            // to convert int array into Stream
            IntStream intStream = Arrays.stream(arr);
      
            // Displaying elements in Stream
            intStream.forEach(str -> System.out.print(str + " "));
      
            // --------- Using Stream.of() ---------
      
            // to convert int array into Stream
            Stream stream = Stream.of(arr);
      
            // ***** Flattening of Stream into IntStream *****
      
            // flattenning Stream into IntStream
            // using flatMapToInt()
            IntStream intStreamNew = stream.flatMapToInt(Arrays::stream);
      
            // Displaying elements in IntStream
            intStreamNew.forEach(str -> System.out.print(str + " "));
        }
    }
    
  3. Stream.of() 是通用的,而 Arrays.stream 不是

    Arrays.stream() 方法仅适用于 int[]、long[] 和 double[] 类型的原始数组,并分别返回 IntStream、LongStream 和 DoubleStream。对于其他原始类型, Arrays.stream() 将不起作用。
    另一方面, Stream.of() 返回 T 类型的通用 Stream (Stream )。因此,它可以与任何类型一起使用。

    例子:

    • 对于 Arrays.stream() 方法:
      // Java program to demonstrate return type
      // of Arrays.stream() method
      // for primitive arrays of char
        
      import java.util.*;
      import java.util.stream.*;
        
      class GFG {
        
          public static void main(String[] args)
          {
              // Creating a character array
              char arr[] = { '1', '2', '3', '4', '5' };
        
              // --------- Using Arrays.stream() ---------
              // This will throw error
        
              // to convert char array into Stream
              Arrays.stream(arr);
          }
      }
      

      输出:

    • 对于 Stream.of() 方法:
      // Java program to demonstrate return type
      // of Stream.of() method
      // for primitive arrays of char
        
      import java.util.*;
      import java.util.stream.*;
        
      class GFG {
        
          public static void main(String[] args)
          {
              // Creating a character array
              char arr[] = { '1', '2', '3', '4', '5' };
        
              // --------- Using Stream.of() ---------
              // Will work efficiently
        
              // to convert int array into Stream
              Stream stream = Stream.of(arr);
        
              // Displaying elements in Stream
              stream.forEach(str -> System.out.print(str + " "));
          }
      }