【问题标题】:Remove a character from every item of a list in JAVA从JAVA列表的每个项目中删除一个字符
【发布时间】:2020-02-26 21:10:27
【问题描述】:

我有一个这样的字符串"-FOREST&-JUNGLE&DESERT"
该字符串在列表中被拆分为单词,如下所示:[-FOREST, -JUNGLE ,DESERT]
List<String> pattern = Arrays.asList(s.split("\\s*&\\s*"));

开头带有减号的每个单词都必须在一个新列表中,并且每个不带负号的单词都必须在另一个列表中,如下所示:

List<String> allowedtags = pattern
                            .stream()
                            .filter(name -> !name.startsWith("-"))
                            .collect(Collectors.toList());

List<String> unwantedtags = pattern
                            .stream()
                            .filter(name -> name.startsWith("-"))
                            .collect(Collectors.toList());

我的问题是我的unwantedtags 在开头保留带有减号的单词,但是对于我的所有操作,我需要摆脱它。如果我执行下面的示例,如果“FOREST”在taglist 中,它将不起作用,因为我的unwantedtags 包含“-FOREST”。

if (taglist.stream().anyMatch(unwantedtags::contains)) {
                        return !IsWhitelist;
                        }

那么我该如何修复我不需要的标签列表呢?也许在 java 8 流 api 中? 此外,我有一种感觉,一方面它工作得很好,但另一方面,我觉得这是获得两个列表的大量代码。可以优化吗?

【问题讨论】:

    标签: java arraylist java-stream


    【解决方案1】:

    您可以映射每个元素以在检测到后去除前导减号:

    List<String> unwantedtags = pattern
                                .stream()
                                .filter(name -> name.startsWith("-"))
                                .map(name -> name.substring(1))
                                .collect(Collectors.toList());
    

    通过显式构造和填充列表可以使代码更高效。然后您可以一次处理pattern 而不是两次:

    List<String> allowedtags = new ArrayList();
    List<String> unwantedtags = new ArrayList();
    pattern.stream()
           .forEach(name -> {
                    if (name.startsWith("-")) unwantedtags.add(name.substring(1));
                    else allowedtags.add(name);
                }
            );
    

    【讨论】:

    • 如果我添加你的单通道,我会得到“lambda 表达式中的错误返回类型:布尔值无法转换为 void。
    • @ErikSteiner - 是的,我的 lambda 语法是错误的。我把它修好了。
    【解决方案2】:

    您缺少一个操作。使用 map() 运算符,您可以获取输入字符串并对其进行修改。

    List<String> unwantedtags = pattern
                    .stream()
                    .filter(name -> name.startsWith("-"))
                    .map(name -> name.substring(1))
                    .collect(Collectors.toList());
    

    【讨论】:

      【解决方案3】:

      您可以使用groupingBy 划分此集合(按name.startsWith("-")):

      Map<Boolean, List<String>> collect = pattern.stream()
              .collect(Collectors.groupingBy(name -> name.startsWith("-")));
      

      那么你有:

      {false=[DESERT], true=[-FOREST, -JUNGLE]}
      

      之后您可以进行进一步处理(使用unwantedtags):

      List<String> unwantedtags = collect
              .getOrDefault(true, List.of()).stream()
              .map(name -> name.substring(1))
              .collect(Collectors.toList());
      

      或者您可以在一个流中完成,但看起来会更复杂。

      Map<Boolean, List<String>> collectWithMap = pattern.stream()
              .collect(Collectors.groupingBy(name -> name.startsWith("-"),
                      Collectors.mapping(name -> name.startsWith("-") ? name.substring(1) : name, 
                              Collectors.toList())));
      

      结果:

      {false=[DESERT], true=[FOREST, JUNGLE]}
      

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 1970-01-01
        • 1970-01-01
        • 2018-09-14
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多