Считайте пустые и пустые записи такими же, как в Collectors.groupingBy - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть список объектов, в которых несколько записей могут иметь свойство пустого значения, а некоторые могут иметь свойство нулевого значения.Используя Collectors.groupingBy, мне нужно, чтобы обе записи рассматривались как одинаковые.

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class Code {
    private String type;
    private String description;

    public static void main(String[] args) {
        List<Code> codeList = new ArrayList<>();
        Code c = new Code();
        c.setDescription("abc");
        c.setType("");
        codeList.add(c);
        Code c1 = new Code();
        c1.setDescription("abc");
        c1.setType(null);
        codeList.add(c1);

        Map<String, List<Code>> codeMap = codeList.stream()
                                                  .collect(Collectors.groupingBy(code -> getGroupingKey(code)));
        System.out.println(codeMap);
        System.out.println(codeMap.size());

    }

    private static String getGroupingKey(Code code) {
        return code.getDescription() +
                "~" + code.getType();
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

Результат codeMap будет содержать две записи, поскольку он рассматривает пустую строку и нулевое значение в свойстве Type как разные.Как можно получить здесь одну запись, считая как нулевые, так и пустые записи одинаковыми.

1 Ответ

0 голосов
/ 23 ноября 2018

Вы можете изменить свой метод getGroupingKey следующим образом:

private static String getGroupingKey(Code code) {
    return code.getDescription() + "~" + (code.getType() == null ? "" : code.getType());
}

или следующим образом:

private static String getGroupingKey(Code code) {
    return code.getDescription() + "~" + Optional.ofNullable(code.getType()).orElse("");
}

, или вы также можете изменить свой метод getType() напрямую, как в:

public String getType() {
    return type == null ? "" : type;
}

или:

public String getType() {
    return Optional.ofNullable(type).orElse("");
}

Либо должно работать одинаково.Выберите один в зависимости от ваших требований, я думаю ..

Если вы добавите следующий метод toString в свой класс Code:

@Override
public String toString() {
    return "Code{" +
            "type='" + type + '\'' +
            ", description='" + description + '\'' +
            '}';
} 

.. с измененным методом getGroupingKey(или метод getType) вывод должен выглядеть следующим образом:

{abc~=[Code{type='', description='abc'}, Code{type='null', description='abc'}]}
1

Редактировать: Вы также можете рассмотреть возможность инициализации типа пустой строкой вместо null, тогда вам не нужно будет изменятьчто-нибудь:

private String type = "";

Это тоже может быть вариант ..

...