import java.util.Collections; import java.util.HashMap; import java.util.Map; class ParallelLetterFrequency { private static Map letterFrequencyMap; private final String NOT_A_LETTER = "\\P{L}+"; ParallelLetterFrequency(String letters) { letterFrequencyMap = getMapFromLetters(letters.toLowerCase().replaceAll(NOT_A_LETTER, "")); } Map getMapFromLetters(String letters) { return letters .chars() .parallel() .collect(Counts::new, Counts::increment, Counts::combine) .buildMap(); } private static class Counts { private Map letterCounts = new HashMap<>(); private void increment(int letter) { letterCounts.put(letter, letterCounts.getOrDefault(letter, 0) + 1); } private void combine(Counts other) { other.letterCounts.keySet() .forEach(letter -> letterCounts.merge(letter, other.letterCounts.get(letter), Integer::sum)); } private Map buildMap() { return Collections.unmodifiableMap(letterCounts); } } Map letterCounts() { return letterFrequencyMap; } }