Mapping words to letters which contains
Not sure about its efficiency or whether or not it improves your algorithm, but since you want to use streams, this would be an option:

public static void main(String[] args) {
        String sentence = "ala ma kota, kot koduje w Javie kota .kota";
        String sanitizedSentence = sentence.replaceAll("[^A-Za-z ]", "").toLowerCase();
        String[] words = sanitizedSentence.split(" ");
        Map&lt;String,List&lt;String&gt;&gt; result = sanitizedSentence
            .chars()
            .filter(Character::isAlphabetic)
            .distinct()
            .sorted()
            .mapToObj(c-&gt;(char)c)
            .map(Object::toString)
            .collect(Collectors.toMap(
                Function.identity(), 
                c-&gt;Stream.of(words).distinct().filter(word -&gt; word.contains(c)).sorted().collect(Collectors.toList()),
                (a,b)-&gt;a,
                LinkedHashMap::new // &lt;- to ensure they are shown in order when printing
            ));
        System.out.println(result);
    }