【问题标题】:How to modify elements inside List using stream and ignore last element?如何使用流修改 List 内的元素并忽略最后一个元素?
【发布时间】:2021-11-23 10:12:25
【问题描述】:

我有以下清单:

var list = Arrays.asList("a", "b", "c");

我想实现这样的目标:

// "a, "
// "b, "
// "c"

所以我这样做了:

var formattedList = list.stream()
        .map(el -> el + ", ")
        .collect(Collectors.toList());

一切正常:

// "a, "
// "b, "
// "c, "

但正如您所见,我不知道如何“省略”流中的最后一个元素。

有人可以帮我实现吗?

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    如果你有一个列表,Tahas 的答案会很棒,但是如果你对于某些用例有一个流,你就可以这样做。

    String result = list.stream()
        .collect(Collectors.joining(","));
    

    【讨论】:

      【解决方案2】:

      你可以使用String.join()

      var list = Arrays.asList("a", "b", "c");
      String.join(",", list) // returns a,b,c
      

      我假设你想加入元素。但如果你不这样做,我认为流 api 不适合这个。传统的迭代器会更好。因为您的要求基于元素的索引。在流中,不提供索引信息。

      【讨论】:

      【解决方案3】:

      您可以使用.limit() 来限制流式传输的原始列表的元素:

              Stream.concat(
                      list.stream().map(el -> el + ", ").limit(list.size() - 1),
                      Stream.of(list.get(list.size() - 1)))
                  .collect(Collectors.toList());
      

      【讨论】:

      • 我重新阅读了这篇文章,似乎 OP 实际上希望将映射应用于除最后一个元素之外的所有元素,但结果列表仍应包含所有元素。还是我理解错了?
      • 是的,我想保留最后一个元素
      • 这不会保留最后一个元素(我的回答也没有,这就是我删除它的原因)
      • 啊,那是真的……它实际上并没有保留最后一个元素。
      • 好点,@FedericoklezCulloca。我已经更新了我的答案以在仍然使用流的同时达到预期的结果,尽管我认为 Taha 的答案更好。
      【解决方案4】:

      可以通过IntStream 完成。

      var list = Arrays.asList("a", "b", "c");
      
      var formattedList = IntStream.range(0, list.size())
          .mapToObj(i -> i != list.size() - 1 ? list.get(i) + ", " : list.get(i))
          .collect(Collectors.toList());
      

      但是,如果您确实需要一个字符串而不是对象列表,当然按照建议使用String#join 会更合理。

      【讨论】:

        猜你喜欢
        • 2017-09-25
        • 2018-11-17
        • 2020-09-14
        • 1970-01-01
        • 1970-01-01
        • 2014-09-10
        • 1970-01-01
        • 2010-11-17
        • 2022-12-03
        相关资源
        最近更新 更多