[英]Remove a character from every item of a list in JAVA
我有一个像这样的字符串"-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
的标签在开头保留带有减号的单词,但是对于我的所有操作,我需要摆脱它。 如果我做下面的例子中,如果“林”是它不会工作taglist
作为我unwantedtags
包含“-Forest”。
if (taglist.stream().anyMatch(unwantedtags::contains)) {
return !IsWhitelist;
}
那么如何修复我不需要的标签列表呢? 也许在java 8流api中? 此外,我觉得一方面它在这一点上工作得很好,但另一方面我觉得这是很多代码来获取两个列表。 可以优化吗?
您可以映射每个元素以在检测到它后去掉前导减号:
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);
}
);
您缺少一个操作。 使用 map() 运算符,您可以获取输入字符串并对其进行修改。
List<String> unwantedtags = pattern
.stream()
.filter(name -> name.startsWith("-"))
.map(name -> name.substring(1))
.collect(Collectors.toList());
您可以使用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]}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.