comment puis-je changer cette méthode en lambda sans boucles ou si?

public Collection<String> test (Collection<String> strings) {
    ArrayList<String> arrayListOfStrings = new ArrayList();

    for(String str : strings) {
        if(str.length() >= 10) {
            String s = str.substring(str.length() / 2);
            if(s.charAt(0) >= 'a') {
                arrayListOfStrings.add(s.toUpperCase());
            }
        }
    }
    return arrayListOfStrings;
}

je l'ai essayé de cette façon, quelqu'un a-t-il une autre ou meilleure solution?:

public Collection<String> test (Collection<String> strings) {

    ArrayList<String> arrayListOfStrings = new ArrayList<String>();
    Stream<String> myStream = strings.stream()
            .filter(str -> str.length() >= 10)
            .map(str -> str.substring(str.length()/2))
            .filter(str -> str.charAt(0) >= 'a');

    myStream.forEach(str -> arrayListOfStrings.add(str.toUpperCase()));

    return arrayListOfStrings ;

}

merci pour de l'aide :)

0
gtr 14 janv. 2020 à 04:11

2 réponses

voici une solution. probablement plus lent mais c'est ce que vous vouliez.

    public Collection<String> test2(Collection<String> strings, int minLength) {
        return strings.stream().filter(s -> s.length() >= minLength)
                .map(s -> s.substring(s.length() / 2))
                .filter(s -> s.charAt(0) >= 'a')
                .map(String::toUpperCase)
                .collect(Collectors.toList());
    }
0
Jason 14 janv. 2020 à 02:00

Vous devez utiliser le collecte() méthode utilisant Collectors.toList () :

public Collection<String> test(Collection<String> strings) {
    return strings.stream()
            .filter(str -> str.length() >= 10)
            .map(str -> str.substring(str.length() / 2))
            .filter(s -> s.charAt(0) >= 'a')
            .map(String::toUpperCase)
            .collect(Collectors.toList());
}

Votre question disait:

sans aucune boucle ou si

mais vous devez savoir que filter() utilise une instruction if et collect() utilise une boucle pour itérer les éléments du flux, vous n'avez donc pas éliminé les "boucles ou si", vous viens de déléguer cette logique au cadre de flux.

1
Andreas 14 janv. 2020 à 01:48