从List <string>中查找具有最大小写字母数的字符串。 (使用流)

时间:2015-06-05 18:52:18

标签: java collections java-8 java-stream

我做过这样的事情:

List<String> strList = asList("getElementById", "htmlSpecialChars", "httpRequest");
String maxOfLowercase = strList.stream()
            .max((o1, o2) -> {
                long lowerCount1 = o1.chars().filter(Character::isLowerCase).count();
                long lowerCount2 = o2.chars().filter(Character::isLowerCase).count();
                return Long.compare(lowerCount1, lowerCount2);
            }).get();

但我认为有可能让这更容易\射手,不是吗?

2 个答案:

答案 0 :(得分:5)

Comparator界面中有方便的静态方法,可以帮助您缩短代码:

String maxOfLowercase = strList.stream()
        .max(Comparator.comparingLong(o -> o.chars().filter(Character::isLowerCase).count()))
        .get();

答案 1 :(得分:0)

更容易/更短的味道,但你可以这样写。

import static java.util.stream.Collectors.*;

List<String> maxOfLowercase = strList.stream()
                      .collect(groupingBy(s -> s.replaceAll("[^a-z]", "").length(),
                                                          TreeMap::new, toList()))
                      .lastEntry().getValue();

一个优点是,如果它们具有相同数量的小写字符,它将为您提供多个单词。这只会过滤每个单词一次,而不是每次比较一次。

如果您想支持所有小写字符,可以使用正则表达式

"[^\\p{javaLowerCase}]"