我需要找到给定列表中包含最大小写字符数的字符串。
这就是我目前正在做的事情
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Strig a with ABDD");
list.add("STR dfd BC dsff");
OptionalLong max = list.stream().map(s->countLowerCase(s)).mapToLong(i->Long.valueOf(i)).max();
System.out.println(max);
}
private static long countLowerCase(String inputString) {
return inputString.chars().filter((s)->Character.isLowerCase(s)).count();
}
有没有更好的方法呢?
答案 0 :(得分:1)
使用Stream
API,我认为有一种稍微简单(单线程?)的方法。
list.stream()
.flatMap(s -> Stream.of(s.chars()
.filter(Character::isLowerCase)
.count()))
.max(Comparator.naturalOrder())
.ifPresent(System.out::println);
或明显更简单的解决方案:
long max = list.stream()
.mapToLong(s -> s.chars().filter(Character::isLowerCase).count())
.max()
.getAsLong();
答案 1 :(得分:1)
是的,Comparator
界面中有一些静态方法可以帮助您缩短上述代码:
System.out.println(list.stream()
.max(Comparator.comparingLong(s -> s.chars().filter(Character::isLowerCase).count())).get()
.chars().filter(Character::isLowerCase).count());
您的输出将是:9
答案 2 :(得分:0)
您无需执行map
后跟mapToLong
,因为您可以首先使用mapToLong
返回功能{/ 1}}:
long
没有更简单的方法。如果您真的想获得“具有最大小写字符数的字符串”而不是仅限数字,您可以使用:
List<String> list = Arrays.asList("Strig a with ABDD", "STR dfd BC dsff");
list.stream()
.mapToLong(s -> s.chars().filter(Character::isLowerCase).count())
.max()
.ifPresent(System.out::println);
将打印list.stream()
.max(Comparator.comparingLong(s -> s.chars().filter(Character::isLowerCase).count()))
.ifPresent(System.out::println);
,因为这是列表中包含最大小写字符数的字符串。