Использование Java 8 Stream для замены цикла и заполнения карты - PullRequest
0 голосов
/ 16 октября 2018

В этом назначении Java у нас есть цикл for, который читает текстовый файл, который мы используем в этой программе, и мы должны заменить его потоком.Вот часть программы и то, что мы должны заменить:

    import java.io.FileNotFoundException;
    import java.util.List;
    import java.util.Map;
    import java.util.TreeMap;


    public class FrequentWords {

    public static void main(String[] args) throws FileNotFoundException {

    String filename = "SophieSallyJack.txt";
    if (args.length == 1) {
        filename = args[0];
    }
    Map<String, Integer> wordFrequency = new TreeMap<>();

    List<String> incoming = Utilities.readAFile(filename);

    // TODO replace the following loop with a single statement using streams    
    // that populates wordFrequency         
    for (String word : incoming) {
        word = word.toLowerCase();
        if (!"".equals(word.trim())) {
            Integer cnt = wordFrequency.get(word);
            if (cnt == null) {
                wordFrequency.put(word, 1);
            } else {
                int icnt = cnt + 1;
                wordFrequency.put(word, icnt);
            }
        }
    }

Я пробовал это, и я не могу понять что-либо еще:

incoming.stream()
        .collect(Collectors.toMap(word -> word, word -> 1, Integer::sum)).entrySet();

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

В качестве альтернативы вы можете просто использовать:

wordFrequency = incoming.stream()
                        .map(String::toLowerCase)  // only if you're planning to store in lowercase or else move this to filtering predicate
                        .filter(word -> !word.trim().isEmpty())
                        .collect(Collectors.toMap(Function.identity(), 
                                                       word -> 1, Integer::sum));

, учитывая, что вы знаете, что entrySet() - это Set вместо этого, который не может быть назначен на Map в любом случае, как ввопрос.

0 голосов
/ 16 октября 2018
private static Map<String,Integer> toMapFunction(Collection< ? extends String> collection){
        return collection.stream().map(String::toLowerCase)
                .filter(str -> !str.trim().isEmpty())
                .collect(Collectors.toMap(Function.identity(), value -> 1, (oldValue, newValue) -> oldValue + newValue, TreeMap::new));
    }

    public static void main(String[] args) {
        List<String> stringList = Arrays.asList("joy", "joy", "lobo", "lobo", "lobo", "joy", "joy", "joy", "david", "hibbs");
        System.out.println(toMapFunction(stringList));
    }

и это будет вывод программы:

{david=1, hibbs=1, joy=5, lobo=3}
0 голосов
/ 16 октября 2018

Вот что вы можете попробовать:

wordFrequency = incoming.stream()
               .map(String::toLowerCase).filter(word -> !word.trim().isEmpty())
               .collect(Collectors.toMap
                (word -> word, word -> 1, (a, b) -> a + b, TreeMap::new));

Вы пропустили BinaryOperator, который объединит значения key, уже существует Collectors.toMap()

...