Java 8 в слиянии Карта Сан эксплуатации () использование

Java - 8 равносильно максимум характеристики дополнительной функции-ориентированной, например , как введение lambdaдругих, позволяет лучше функциональное программирование. Inter некоторое время назад случайно обнаружил map.merge()метод, там все еще хорошо использовать, чтобы сделать некоторые простой текст , связанные презентации. Сначала мы рассмотрим на примере.

merge() Как пользоваться?

Предположим, что у нас есть такой период бизнес-логики, у меня есть список объектов, студент достижения, объект содержит имя ученика, предмет, субъекты оценки трех свойств, требуется каждому студенту, чтобы получить общий балл. Добавлено в список следующим образом:

    private List<StudentScore> buildATestList() {
        List<StudentScore> studentScoreList = new ArrayList<>();
        StudentScore studentScore1 = new StudentScore() {{
            setStuName("张三");
            setSubject("语文");
            setScore(70);
        }};
        StudentScore studentScore2 = new StudentScore() {{
            setStuName("张三");
            setSubject("数学");
            setScore(80);
        }};
        StudentScore studentScore3 = new StudentScore() {{
            setStuName("张三");
            setSubject("英语");
            setScore(65);
        }};
        StudentScore studentScore4 = new StudentScore() {{
            setStuName("李四");
            setSubject("语文");
            setScore(68);
        }};
        StudentScore studentScore5 = new StudentScore() {{
            setStuName("李四");
            setSubject("数学");
            setScore(70);
        }};
        StudentScore studentScore6 = new StudentScore() {{
            setStuName("李四");
            setSubject("英语");
            setScore(90);
        }};
        StudentScore studentScore7 = new StudentScore() {{
            setStuName("王五");
            setSubject("语文");
            setScore(80);
        }};
        StudentScore studentScore8 = new StudentScore() {{
            setStuName("王五");
            setSubject("数学");
            setScore(85);
        }};
        StudentScore studentScore9 = new StudentScore() {{
            setStuName("王五");
            setSubject("英语");
            setScore(70);
        }};

        studentScoreList.add(studentScore1);
        studentScoreList.add(studentScore2);
        studentScoreList.add(studentScore3);
        studentScoreList.add(studentScore4);
        studentScoreList.add(studentScore5);
        studentScoreList.add(studentScore6);
        studentScoreList.add(studentScore7);
        studentScoreList.add(studentScore8);
        studentScoreList.add(studentScore9);

        return studentScoreList;
    }
复制代码

Мы смотрим на традиционном подходе:

        ObjectMapper objectMapper = new ObjectMapper();
        List<StudentScore> studentScoreList = buildATestList();

        Map<String, Integer> studentScoreMap = new HashMap<>();
        studentScoreList.forEach(studentScore -> {
            if (studentScoreMap.containsKey(studentScore.getStuName())) {
                studentScoreMap.put(studentScore.getStuName(), 
                                    studentScoreMap.get(studentScore.getStuName()) + studentScore.getScore());
            } else {
                studentScoreMap.put(studentScore.getStuName(), studentScore.getScore());
            }
        });

        System.out.println(objectMapper.writeValueAsString(studentScoreMap));

// 结果如下:
// {"李四":228,"张三":215,"王五":235}
复制代码

Тогда давайте рассмотрим , merge()как это делается:

        Map<String, Integer> studentScoreMap2 = new HashMap<>();
        studentScoreList.forEach(studentScore -> studentScoreMap2.merge(
          studentScore.getStuName(),
          studentScore.getScore(),
          Integer::sum));

        System.out.println(objectMapper.writeValueAsString(studentScoreMap2));

// 结果如下:
// {"李四":228,"张三":215,"王五":235}
复制代码

merge() Краткое введение

merge() Можно отметить, что: он назначен новым значением ключа (если нет) или обновить данное ключевое значение, соответствующее значению, его исходный код выглядит следующим образом:

    default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
        Objects.requireNonNull(remappingFunction);
        Objects.requireNonNull(value);
        V oldValue = this.get(key);
        V newValue = oldValue == null ? value : remappingFunction.apply(oldValue, value);
        if (newValue == null) {
            this.remove(key);
        } else {
            this.put(key, newValue);
        }

        return newValue;
    }
复制代码

Мы видим , принцип очень прост, этот метод принимает три параметра, значение ключа, значение, remappingFunction, если данный ключ не существует, то он становится put(key, value). Тем не менее, если ключ имеет какое - то значение, мы remappingFunctionможем выбрать , чтобы объединить путь, а затем объединяются , чтобы дать newValueзадание на оригинальный ключ.

сценарии использования

Это по - прежнему относительно больше сценариев использования, такие как группировка суммы этих операций, хотя соответствующий поток в groupingBy()методе, но если вы хотите сделать некоторые другие операции в цикле , когда, по- merge()прежнему очень хороший выбор.

другое

В дополнение merge()к методам, я также видел некоторые из Java 8 mapдругих связанных с ними методов, таких как putIfAbsent,, compute(), computeIfAbsent(), computeIfPresentто , как мы смотрим на имя должны знать , что это значит, так , представленные здесь , не делать слишком много, интерес может быть просто читать исходный код (как вполне понятно), где мы писали об compute()(Map.class)исходном коде, возвращаемое значение новое значение вычисляется:

    default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
        Objects.requireNonNull(remappingFunction);
        V oldValue = this.get(key);
        V newValue = remappingFunction.apply(key, oldValue);
        if (newValue == null) {
            if (oldValue == null && !this.containsKey(key)) {
                return null;
            } else {
                this.remove(key);
                return null;
            }
        } else {
            this.put(key, newValue);
            return newValue;
        }
    }
复制代码

резюме

В данной статье приводится краткое введение о Map.merge()методе, кроме того, Java 8 , HashMapиспользуемые для внедрения TreeNodeи красно-черное дерево, может быть немного трудно читать на источник, но все же по аналогичному принципу, compute()сопереживание. Таким образом, не забудьте посмотреть на исходный код, не знаю , где читать более естественно понимать практику.

ссылка

рекомендация

отjuejin.im/post/5d9b455ae51d45782b0c1bfb