簡體   English   中英

Stream.flatMap() 從 char[] 到 Character stream

[英]Stream.flatMap() from char[] to Character stream

import java.util.*; 
import java.util.stream.*; 

class Playground { 

    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<char[]> stream = Stream.of(arr); 
        Stream<Integer> s = stream.flatMap((item)->new String(item).chars().mapToObj(a->(char)a));

        // Displaying elements in Stream 
        s.forEach(str -> System.out.print(str + " ")); 
    } 
} 

我正在嘗試使用 flatMap() 將 char[] 轉換為 stream 字符,但出現以下錯誤

./Playground/Playground.java:14: error: incompatible types: inference variable R has incompatible bounds
        Stream<Integer> s = stream.flatMap((item)->new String(item).chars().mapToObj(a->(char)a));
                                          ^
    equality constraints: Integer
    lower bounds: U,Character
  where R,T,U are type-variables:
    R extends Object declared in method <R>flatMap(Function<? super T,? extends Stream<? extends R>>)
    T extends Object declared in interface Stream
    U extends Object declared in method <U>mapToObj(IntFunction<? extends U>)
1 error

在理解錯誤以及如何完成此任務方面需要幫助。 具體來說,這是如何使用 flatMap() 從 char[] 到 Character stream 修復這行代碼的。

Stream<Integer> s = stream.flatMap((item)->new String(item).chars().mapToObj(a->(char)a))

編輯:所以問題不是關於 Stream,而是關於 lambda 表達式,我在意外修復 lambda 表達式后抽動了線條並弄亂了打字。 原來的線路是

Stream<Character> s = stream.flatMap(item->{new String(item).chars().mapToObj(a->(char)a);});

問題是 {} 中缺少 return 語句。 然后我將行更改為

Stream<Integer> s = stream.flatMap((item)->new String(item).chars())

因為我認為 IntStream::mapToObj 造成了麻煩,但是我最后忘記了 boxed() 並得到了另一個類型錯誤,所以我添加了 IntStream::mapToObj 並發布了問題但忘記將 Stream 類型改回 Character。 我很困惑,但迷霧現在已經清除了。謝謝你的好答案。

你快到了。 只需將Stream<Integer>替換為Stream<Character> ,因為您正在轉換為代碼中的char

但是,關於您的代碼的問題是您不必要地flatMap ping Stream.of需要一個以引用類型作為其復合類型的數組。 此外, Arrays.stream沒有char[]的重載。 您最終流式傳輸保證是單個元素的內容。 該元素是您的char[]

你可以放棄flatMap操作,直接將 char 數組轉換為 String。

String str = new String(arr);
Stream<Character> characterStream = str.chars().mapToObj(c -> (char) c);

目前尚不清楚您要通過這種不必要的操作繞行來實現什么。 當你想對數組進行 stream 時,只需從該操作開始,而不是創建單個元素 stream 來鏈接flatMap ,鏈接另一個map

您的代碼確實已經包含一種使用String構造函數在其他操作中間流過char[]數組的方法。

char[] arr = { '1', '2', '3', '4', '5' };

new String(arr).chars().forEach(i -> System.out.print(i + " "));

這將打印 Unicode 數字。 當你想改為打印字符時,只需更改終端操作:

new String(arr).chars().forEach(i -> System.out.print((char)i + " "));

要么

new String(arr).chars().forEach(i -> System.out.printf("%c ", i));

您也可以使用

new String(arr).chars().mapToObj(i -> (char)i).forEach(i -> System.out.print(i+" "));

但這會產生裝箱開銷,因為它創建了一個Stream<Character>


請注意, new String(arr)會產生復制開銷,因為它會創建一個不可變的 object。您可以通過使用來避免這種情況

CharBuffer.wrap(arr).chars().forEach(i -> System.out.printf("%c ", i));

當然,你可以插入任意多的花體,例如

Stream.of(arr)
    .flatMapToInt(array -> CharBuffer.wrap(array).chars())
    .mapToObj(i -> (char)i) // returns a Stream<Character> not Stream<Integer>
    .forEach(i -> System.out.printf("%c ", i));

但沒有理由這樣做。

  • 您可以將Arrays.stream()用於除 byte、char 或 short 之外的任何數組。
  • 您可以將*Stream.of()用於類型 * 的任何原始數組,其中 * 是 Int 或 Double,或 Long。
  • 您可以對任何 Object 數組使用Stream.of()

以下所有工作如上所述。

Integer[] IntegerArray = {1,2,3,4};
Arrays.stream(IntegerArray).forEach(System.out::println);
Stream.of(IntegerArray).forEach(System.out::println);

int[] intArray = {1,2,3,4};
Arrays.stream(intArray).forEach(System.out::println);
IntStream.of(intArray).forEach(System.out::println);

double[] doubleArray = {1.2,3.3,4.5,6.7};
Arrays.stream(doubleArray).forEach(System.out::println);
DoubleStream.of(doubleArray).forEach(System.out::println);

String[] stringArray = {"a","b","c","d"};
Stream.of(stringArray).forEach(System.out::println);

要解決您的實際問題,請嘗試此操作。

     // Creating a character array 
        char arr[] = { '1', '2', '3', '4', '5' }; 

        // --------- Using Stream.of() --------- 
        // Will work efficiently 

        // to convert int array into Stream 
        Stream<char[]> stream = Stream.of(arr); 


        // Displaying elements in Stream 
        s.forEach(str -> System.out.print(str + " ")); 
        Stream<Integer> s = stream.flatMapToInt((item)->(new String(item)).chars()).boxed();
        //or
        IntStream s = stream.flatMapToInt((item)->(new String(item)).chars());

        // Displaying elements in Stream 
        s.forEach(str -> System.out.print((char)str + " ")); 



您使用Stream<Integer>而不是Stream<Character> 如果要使用Stream<Integer> ,則需要使用IntStream::boxedmapToObj(a -> Integer.valueOf(a)) ,如下所示:

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        char arr[] = { '1', '2', '3', '4', '5' };

        Stream<char[]> stream1 = Stream.of(arr);
        Stream<Character> chars = stream1.flatMap(item -> new String(item).chars().mapToObj(a -> (char) a));
        chars.forEach(c -> System.out.print(c + " "));

        System.out.println();

        Stream<char[]> stream2 = Stream.of(arr);
        Stream<Integer> ints = stream2.flatMap(item -> new String(item).chars().boxed());
        ints.forEach(i -> System.out.print(i + " "));

        System.out.println();

        Stream<char[]> stream3 = Stream.of(arr);
        Stream<Integer> integers = stream3.flatMap(item -> new String(item).chars().mapToObj(a -> Integer.valueOf(a)));
        integers.forEach(i -> System.out.print(i + " "));
    }
}

Output:

1 2 3 4 5 
49 50 51 52 53 
49 50 51 52 53 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM