[JAVA] Point 45: Utilisez judicieusement les flux

45. Stream doit être utilisé avec prudence

package tryAny.effectiveJava;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Anagrams {
    public static void main(String[] args) throws IOException {
        File dictionary = new File("/application/gradle/getting-started.html");
        int minGroupSize = 2;

        Map<String, Set<String>> groups = new HashMap<>();

        //Exemple 1 début
        try (Scanner s = new Scanner(dictionary)) {
            while (s.hasNext()) {
                String word = s.next();
                groups.computeIfAbsent(alphabetize(word), (unused) -> new TreeSet<>()).add(word);
            }
        }
        for (Set<String> group : groups.values()) {
            if (group.size() >= minGroupSize) {
                System.out.println(group.size() + ":" + group);
            }
        }
        //Exemple 1 fin

        //Exemple 2 début(Ceci est différent de l'exemple 1 car l'anagramme est pris ligne par ligne.)
        Path dictionary2 = Paths.get("/application/gradle/getting-started.html");
        try (Stream<String> words = Files.lines(dictionary2)) {
            words.collect(Collectors.groupingBy(word -> word.chars().sorted()
                    .collect(StringBuilder::new, (sb, c) -> sb.append((char) c), StringBuilder::append).toString()))
                    .values().stream().filter(group -> group.size() >= minGroupSize)
                    .map(group -> group.size() + ":" + group).forEach(System.out::println);
        }
        //Exemple 2 fin

        //Exemple 3 début (même résultat que l'exemple 2)
        try (Stream<String> words = Files.lines(dictionary2)) {
            words.collect(Collectors.groupingBy(word -> alphabetize(word)))
            .values().stream()
                    .filter(group -> group.size() >= minGroupSize)
                    .forEach(g -> System.out.println(g.size() + ":" + g));
        }
        //Exemple 3 fin
    }

    private static String alphabetize(String s) {
        char[] a = s.toCharArray();
        Arrays.sort(a);
        return new String(a);
    }
}
package tryAny.effectiveJava;

public class CharStream {
    public static void main(String[] args) {
        "Hello, world!".chars().forEach(System.out::print);
        //72101108108111443211911111410810033 s'affiche

        System.out.println();

        "Hello, world!".chars().forEach(x -> System.out.print((char) x));
        // Hello, world!Est affiché
    }
}
package tryAny.effectiveJava;

import static java.math.BigInteger.*;

import java.math.BigInteger;
import java.util.stream.Stream;

public class MersennePrimes {
    public static void main(String[] args) {
        primes().map(p -> TWO.pow(p.intValueExact()).subtract(ONE)).filter(mersenne -> mersenne.isProbablePrime(50))
                .limit(20)
                // .forEach(System.out::println);
                .forEach(mp -> System.out.println(mp.bitLength() + ":" + mp));
    }

    static Stream<BigInteger> primes() {
        return Stream.iterate(TWO, BigInteger::nextProbablePrime);
    }
}

Recommended Posts

Point 45: Utilisez judicieusement les flux
Item 52: Utiliser la surcharge judicieusement
Point 83: Utilisez judicieusement l'initialisation paresseuse
Point 66: Utiliser judicieusement les méthodes natives
Point 48: Soyez prudent lorsque vous créez des flux parallèles
Article 55: Renvoyez judicieusement les options
Point 26: N'utilisez pas de types bruts
Point 32: Combiner judicieusement les génériques et les varargs
Point 46: Préférez les fonctions sans effets secondaires dans les flux
Point 59: Connaître et utiliser les bibliothèques
Élément 40: utiliser systématiquement l'annotation de remplacement
Rubrique 69: N'utiliser des exceptions que pour des conditions exceptionnelles
Point 41: Utiliser les interfaces de marqueurs pour définir les types
Élément 36: utiliser EnumSet au lieu de champs de bits
Point 71: éviter l'utilisation inutile d'exceptions vérifiées
Point 37: Utilisez EnumMap au lieu de l'indexation ordinale
Point 72: Favoriser l'utilisation d'exceptions standard