从 List<String> 中找出小写字母数量最多的 String。 (使用流)
Find the String with the largest number of lowercase letters from a List<String>. (Using streams)
我做过这样的事情:
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();
但我认为可以做得更多 easier\shoter,不是吗?
Easier/shorter是尝尝,但你可以这样写。
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}]"
Comparator
接口中有方便的静态方法,可以帮助您缩短代码:
String maxOfLowercase = strList.stream()
.max(Comparator.comparingLong(o -> o.chars().filter(Character::isLowerCase).count()))
.get();
我做过这样的事情:
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();
但我认为可以做得更多 easier\shoter,不是吗?
Easier/shorter是尝尝,但你可以这样写。
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}]"
Comparator
接口中有方便的静态方法,可以帮助您缩短代码:
String maxOfLowercase = strList.stream()
.max(Comparator.comparingLong(o -> o.chars().filter(Character::isLowerCase).count()))
.get();