[JAVA] Punkt 45: Verwenden Sie Streams mit Bedacht

45. Stream sollte mit Vorsicht verwendet werden

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

        //Beispiel 1 starten
        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);
            }
        }
        //Beispiel 1 Ende

        //Beispiel 2 starten(Dies unterscheidet sich von Beispiel 1, da das Anagramm Zeile für Zeile erstellt wird.)
        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);
        }
        //Beispiel 2 Ende

        //Start von Beispiel 3 (gleiches Ergebnis wie in Beispiel 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));
        }
        //Beispiel 3 Ende
    }

    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 wird angezeigt

        System.out.println();

        "Hello, world!".chars().forEach(x -> System.out.print((char) x));
        // Hello, world!Wird angezeigt
    }
}
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

Punkt 45: Verwenden Sie Streams mit Bedacht
Punkt 52: Verwenden Sie Überladung mit Bedacht
Punkt 83: Verwenden Sie die verzögerte Initialisierung mit Bedacht
Punkt 66: Verwenden Sie native Methoden mit Bedacht
Punkt 48: Seien Sie vorsichtig, wenn Sie Streams parallel schalten
Punkt 55: Optionen mit Bedacht zurückgeben
Punkt 26: Verwenden Sie keine Rohtypen
Punkt 32: Kombinieren Sie Generika und Varargs mit Bedacht
Punkt 46: Bevorzugen Sie nebenwirkungsfreie Funktionen in Streams
Punkt 59: Kennen und verwenden Sie die Bibliotheken
Punkt 40: Verwenden Sie konsequent die Überschreibungsanmerkung
Punkt 69: Verwenden Sie Ausnahmen nur für außergewöhnliche Bedingungen
Punkt 41: Verwenden Sie Markierungsschnittstellen, um Typen zu definieren
Punkt 36: Verwenden Sie EnumSet anstelle von Bitfeldern
Punkt 71: Vermeiden Sie die unnötige Verwendung geprüfter Ausnahmen
Punkt 37: Verwenden Sie EnumMap anstelle der ordinalen Indizierung
Punkt 72: Bevorzugen Sie die Verwendung von Standardausnahmen