【问题标题】:Convert nested loops into streams Java 8将嵌套循环转换为流 Java 8
【发布时间】:2021-01-04 17:52:34
【问题描述】:

我正在尝试将下面的嵌套循环转换为 Java 8 流。

newself2 中的每个元素都是一个字符串列表 - ["1 2","3 4"] 需要更改为 ["1","2","3","4"]。

for (List<String> list : newself2) {
    // cartesian = [["1 2","3 4"],["4 5","6 8"]...] list = ["1 2","3 4"]...
    List<String> clearner = new ArrayList<String>();
    for (String string : list) { //string = "1 3 4 5"
        for (String stringElement : string.split(" ")) {
            clearner.add(stringElement);
        }
    }
    newself.add(clearner);
    //[["1","2","3","4"],["4","5","6","8"]...]
}

到目前为止我所尝试的 -

newself2.streams().forEach(list -> list.foreach(y -> y.split(" ")))  

现在我确定如何将内部 for 循环中的拆分数组添加到 x 的新列表中?

非常感谢任何帮助。

【问题讨论】:

    标签: java loops java-8 java-stream


    【解决方案1】:

    我会这样做:

    List<List<String>> result = newself2.stream()
        .map(list -> list.stream()
                .flatMap(string -> Arrays.stream(string.split(" ")))
                .collect(Collectors.toList()))
        .collect(Collectors.toList());
    

    【讨论】:

    • 首先感谢您的回答!它完美地工作!但我仍然想知道——因为我是新手——这是最好的方法吗?是否可以进一步加快速度?
    • @PaulAlwin 流有一些开销,因为它们需要创建所有内部基础架构才能完成工作。所以一个 for 通常会有更好的性能。另一方面,流很容易并行化并且可以更好地扩展。关于我的解决方案的复杂性,它与您的相同,即与空格分隔元素的数量成线性关系。
    【解决方案2】:

    这是其他解决方案。

    Function<List<String>,List<String>> function = list->Arrays.asList(list.stream()
                .reduce("",(s, s2) -> s.concat(s2.replace(" ",",")+",")).split(","));
    

    并使用此功能

     List<List<String>> finalResult = lists
                                     .stream()
                                     .map(function::apply)
                                     .collect(Collectors.toList());
    

    for循环类似:

      List<List<String>> finalResult = new ArrayList<>();
        for (List<String> list : lists) {
            String acc = "";
            for (String s : list) {
                acc = acc.concat(s.replace(" ", ",") + ",");
            }
            finalResult.add(Arrays.asList(acc.split(",")));
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-14
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      相关资源
      最近更新 更多