2015-06-05 10 views
5

che ho fatto qualcosa di simile:Trova la stringa con il numero più grande di lettere minuscole da un elenco <String>. (Utilizzo di flussi)

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(); 

ma penso sia possibile per rendere questo più facile \ shoter, non è vero?

risposta

5

Ci sono metodi statici conveniente a Comparator interfaccia che può aiutare a rendere il codice più corto:

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

Più facile/breve è gustare ma lo si può scrivere in questo modo.

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

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

Un vantaggio è che ti darà più parole se hanno lo stesso numero di caratteri minuscoli. Questo filtrerà solo ogni parola una volta, anziché una volta per confronto.

Se si desidera supportare tutti i caratteri minuscoli è possibile utilizzare l'espressione regolare

"[^\\p{javaLowerCase}]" 
Problemi correlati