【问题标题】:How to convert Stream<Stream<String>> to List? [closed]如何将 Stream<Stream<String>> 转换为 List? [关闭]
【发布时间】:2020-11-09 18:03:55
【问题描述】:

我这里有一些代码:

public class MapAndFlatMap {

public static Stream<String> letters(String s) {
    List<String> result = new ArrayList<>();
    for (int i = 0; i < s.length(); i++)
        result.add(s.substring(i, i + 1));
    return result.stream();
}

public static void main(String[] args) {
    List<String> words = Arrays.asList("BOAT", "LORRY");

    Stream<String> lowercaseWords = words.stream().map(String::toLowerCase);
    List<String> result = lowercaseWords.collect(Collectors.toList());
    System.out.println(result);

    Stream<String> firstLetters = words.stream().map(s -> s.substring(0, 1));
    result = firstLetters.collect(Collectors.toList());
    System.out.println(result);

    Stream<String> func2 = words.stream().flatMap(w -> letters(w));
    result = func2.collect(Collectors.toList());
    System.out.println(result);

    Stream<Stream<String>> func = words.stream().map(w -> letters(w));

}

}

问题是我不知道如何将 Stream&lt;Stream&lt;String&gt;&gt; func = words.stream().map(w -&gt; letters(w)); 转换为 List 以将其直接显示到控制台中,就像我在前面的示例中所做的那样。

【问题讨论】:

  • 你的意思是:List&lt;Stream&lt;String&gt;&gt; func = words.stream().map(w -&gt; letters(w)).collect(Collectors.toList());
  • 期望的输出是什么? List> 或 List ?
  • @Beri 如果你展示如何做到这两点,这对我真的很有帮助

标签: java java-stream java-threads


【解决方案1】:

如果你想得到一个List&lt;String&gt;

List<String> singleListResult = words.stream()
                               .flatMap(w -> letters(w)) //result:  Stream<String>
                               .collect(Collectors.toList());

如果你想要List&lt;List&lt;String&gt;&gt;

List<List<String>> nestedList= words.stream()
                               .map(w -> letters(w).collect(Collectors.toList())) //result: Stream<List<String>> 
                               .collect(Collectors.toList());

【讨论】:

  • 非常感谢,非常感谢
【解决方案2】:

以下内容也可以帮助您,

        List<String> words = Arrays.asList("BOAT", "LORRY");

        List<String> collect = words.stream()
                                    .map(s -> s.codePoints()
                                               .mapToObj(a -> String.valueOf((char)a))
                                               .collect(Collectors.joining(",")))
                                    .collect(Collectors.toList());
        System.out.println("output = " + collect);

【讨论】:

    【解决方案3】:

    您不需要letters 方法来获取单个流中单词的字母。

    • String.split("") - 将创建一个字符串的字母数组。
    • Arrays.stream() - 将流式传输该数组。
    • flatMap 会将所有这些流合并为一个。
    List<String> list =
            words.stream().flatMap(a -> Arrays.stream(a.split("")))
                    .collect(Collectors.toList());
    
    System.out.println(list);
    

    打印

    [B, O, A, T, L, O, R, R, Y]
    

    【讨论】:

    • 我需要那个方法,因为我正在读一本书,这个例子就是在其中发生的。这就是为什么我想弄清楚如何去做。但感谢您的另一个解释
    猜你喜欢
    • 2023-03-31
    • 2020-09-04
    • 2021-07-22
    • 1970-01-01
    • 2020-09-15
    • 2021-02-11
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多