有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何通过函数编程计算Java中的元音?

我需要计算函数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;

有更好的方法吗


共 (4) 个答案

  1. # 1 楼答案

    您可能担心的是多个replace调用,这与函数式编程无关。替换这些调用的一种方法是使用正则表达式和replaceAll

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

    这个单一映射将替换所有删除元音的5个映射

    使用正则表达式,还可以删除所有非元音。这样,就不必减去^{

    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的步骤。这个操作现在只被描述为功能的组合(就这个抽象级别而言),而不是一堆“步骤”

  2. # 2 楼答案

    这个怎么样:

    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
    
  3. # 3 楼答案

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

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

    [aeiou]它将匹配[]中的任何字符,并用空字符串替换它

  4. # 4 楼答案

    我会把它分解成字符流,只过滤元音,然后数数:

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