如何通过函数式编程在Java中计算元音字母的数量?

7
我需要在Functional Java中计算单词列表中元音字母的数量。如果我有这个列表:
List<String> l = Arrays.asList("hello", "world", "test");

我的想法是“删除”元音字母,然后进行减法运算,具体方法如下:
int tot = l.stream().map(s -> s.replace("a", "")).
            map(s -> s.replace("e", "")).
            map(s -> s.replace("i", "")).
            map(s -> s.replace("o", "")).
            map(s -> s.replace("u", "")).
            map(s -> s.length()).reduce(0, Integer::sum);
int res = l.stream().map(s->s.length()).reduce(0, Integer::sum)-tot;

有没有更好的方法来做这件事?

5个回答

4
这个怎么样:
List<String> vowels = Arrays.asList("a", "e", "i", "o", "u");

int count Arrays.stream(string.split(""))  // generate stream from an String[] of single character strings
    .filter(vowels::contains)  // remove all non-vowels
    .count();  // count the elements remaining

4

使用replaceAll可以用一个map去除多个map

    int tot = l.stream()
               .map(s -> s.replaceAll("[aeiou]", "").length())
               .reduce(0, Integer::sum);

[aeiou]会匹配[]内的任何字符,并将其替换为空字符串。


2

我会将它分解为字符流,过滤出只有元音字母的部分,然后进行计数:

int tot = l.stream()
  .flatmap(s -> s.chars().stream())
  .filter(c -> c == 'a' || c == 'e' ||c == 'i' ||c == 'o' ||c == 'u')
  .count();

1

您可能对多个 replace 调用感到担忧,这与函数式编程并没有太大关系。替换这些调用的一种方法是使用正则表达式和 replaceAll

.map(s -> s.replaceAll("[aeiou]", ""))

这张地图可以替代所有去除元音字母的5张地图。
通过正则表达式,您还可以删除所有非元音字母。这样,您就不必减去tot了。
int vowels = l.stream().map(s -> s.replaceAll("[^aeiou]", ""))
                        .map(s -> s.length()).reduce(0, Integer::sum);
// no need to do anything else!

现在你仍然有两个连续的map,你可以将它们合并成一个:
int vowels = l.stream().map(s -> s.replaceAll("[^aeiou]", "").length())
                        .reduce(0, Integer::sum);

现在这个功能更加实用,因为我已经移除了减去tot的步骤。就这个抽象层面而言,这个操作现在仅被描述为函数的组合,而不是一堆“步骤”。


0
Function<String,Integer> vowelsCount = s -> {
        List<Character> vowels = new ArrayList<>(Arrays.asList('a', 'e', 'i', 'o', 'u'));
        s = s.toLowerCase();
        int countVowels = 0;
        for (int index = 0; index < s.length(); index++) {
            char currentChar = s.charAt(index);
            if (vowels.contains(currentChar)) {
                countVowels++;
            }
        }
        return countVowels;
    };
    String str = "Lambda expression pattern";
    System.out.printf("%s ==> %d",str, vowelsCount.apply(str));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接