java - 我需要仅对特定单词进行更改

标签 java filter java-stream

我遇到了 Java 8 流的字符串问题。他们希望我将所有第一个字母更改为大写字母,只要这些单词不属于“the”、“a”、“to”、“of”、“in”组。

我的问题是 filter 命令确实从组中删除了这些单词,而我必须保留它们。

我已经完成了大写第一个字母的部分,但我不知道如何“跳过”这组单词

private List<String> ignoredWords = Arrays.asList("the", "a", "to", "of", "in");
String entryParts[] = toTitlelize.split(" ");

List<String> sentenceParts = Arrays.asList(entryParts);
List<String> finalSentence = sentenceParts.stream()            
        .map(WordUtils::capitalize)
        .collect(toList());

例如:

if toTitlelize = "I love to eat pizza in my home"

它应该返回

"I Love to Eat Pizza in My Home"

目前它给了我:

"I Love To Eat Pizza in My Home"

最佳答案

您可以在映射步骤中使用简单的 if 语句:

List<String> finalSentence = Arrays.stream(entryParts)
        .map(word -> {
            if (ignoredWords.contains(word)) {
                return word;
            }
            return WordUtils.capitalize(word);
        })
        .collect(Collectors.toList());

作为替代方案,您可以在 ignoredWords 上使用 filter()findFirst() 并使用 Optional >:

List<String> finalSentence = Arrays.stream(entryParts)
        .map(word -> ignoredWords.stream().filter(w -> w.equals(word)).findFirst().orElse(WordUtils.capitalize(word)))
        .collect(Collectors.toList());

我还建议使用 HashSet 而不是 List,因为单词是唯一的,并且 contains() 更快:

HashSet<String> ignoredWords = new HashSet<>(Arrays.asList("the", "a", "to", "of", "in"));

String.join("", FinalSentence); 的结果将是:

I Love to Eat Pizza in My Home

关于java - 我需要仅对特定单词进行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55308831/

相关文章:

java - 如何使类可以从不同的包访问,但不能从java中的不同库/jar访问?

java - 用于单个应用程序的 REST 和 SOAP Web 服务

java - 键入时如何正确删除自动添加的右括号

java - CN1 - onTitleScrollAnimation 被窃听

json - 如何在 KQL 中找到动态数组中的特定元素?

node.js - Express.js - 过滤 URL 中的数字和字符串

java - 有没有一种优雅的方式来分块处理流?

java - 将字符串转换为 java.util.Stream<Character>

javascript - 如何在 AngularJS 中使用过滤器从数组中删除项目?

Java 8 Stream 从 map 中提取数据