【问题标题】:using Java stream if a string is found then add to a list and also add an extra element如果找到字符串,则使用 Java 流然后添加到列表并添加额外元素
【发布时间】:2020-10-20 17:18:55
【问题描述】:

如果使用匹配的字符串找到匹配项,我想使用流填充字符串数组,然后将新字符串添加到数组中。

示例此代码将返回一个列表:

  List<String> source = Arrays.asList("one", "two", "three");
    String s ="Two-three-six-seven";

    List<String> target = source.stream()
            .filter(s.toLowerCase()::contains)
            .collect(Collectors.toList());

}

创建一个包含“二”和“三”的列表(目标)。

我现在如何检查目标列表是否有一个值,然后我添加另一个值,例如“数字” 最终得到一个包含“二”、“三”和“数字”的列表

我知道这可以通过在流之外添加更多代码来实现,但我正在尝试在流中完成所有操作

【问题讨论】:

  • 预期结果是什么?
  • if (target.contains("two")) target.add("numbers");
  • 目标数组是“二”“三”和“数字”。 "numbers" 是目标数组不为空时添加的新元素
  • 我认为您错过了直播的重点。流用于获取一组数据,对其进行操作,并输出一组修改后的数据。我不会说你不能使用流添加数据,有人可能会提出一些 hacky 映射方法来做到这一点,但这并不是流的意义所在。最干净的解决方案是保留您拥有的代码,然后在事后添加额外的元素。
  • 我会使用Set而不是List,另外

标签: java lambda stream


【解决方案1】:

正如@Charlie Armstrong 上面评论的那样,Stream 的使用不是很好。 但是,如果您出于任何原因仍需要使用Stream,则可以使用Collectors.collectingAndThen()

List<String> target = source.stream()
        .filter(s.toLowerCase()::contains)
        .collect(Collectors.collectingAndThen(Collectors.toList(),
                list -> list.isEmpty() ? list : 
                        Stream.concat(list.stream(), Stream.of("number"))
                                .collect(Collectors.toList())));

System.out.println(target);

输出

[two, three, number]

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2023-02-15
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多