Уменьшите размер списка с помощью потока Java 8 - PullRequest
6 голосов
/ 17 января 2020

Я хочу уменьшить размер (удалить некоторые элементы) упорядоченного списка объектов карты. Все объекты списка должны быть отброшены, если не выполнено определенное условие. И когда это условие выполнено, все последующие элементы этого списка должны остаться в списке. У меня есть следующий кусок кода. Я хочу сделать то же самое с Java 8.

public List<Map<String, String>> doAction(List<Map<String, String>> dataVoMap) {
    List<Map<String,String>> tempMap = new ArrayList<>();
    boolean found = false;
    for(Map<String, String> map: dataVoMap){
        if(map.get("service_id").equalsIgnoreCase("passed value") || found){
            found = true;
            tempMap.add(map);
        }
    }
    dataVoMap = tempMap;
    return dataVoMap;
}

Ответы [ 2 ]

7 голосов
/ 17 января 2020

Вы ищете операцию dropWhile, но для ее встроенной реализации потребуется Java -9 и выше:

public List<Map<String, String>> doAction(List<Map<String, String>> dataVoMap) {
    return dataVoMap.stream()
            .dropWhile(m -> !"passed value".equalsIgnoreCase(m.get("service_id")))
            .collect(Collectors.toList());
}

Примечание : я внес изменения в существующий код, чтобы избежать NPE, когда в List без ключа service_id.

может быть Map.
3 голосов
/ 17 января 2020

Существует решение с использованием небольшого хака:

public static List<Map<String, String>> doAction(List<Map<String, String>> dataVoMap) {
        AtomicBoolean found = new AtomicBoolean(false);
        return dataVoMap.stream()
                .filter(map -> found.get() || "passed value".equalsIgnoreCase(map.get("service_id")))
                .peek(map -> found.set(true))
                .collect(Collectors.toList());
    }

Если вам не нужно распараллеливать поток, вы можете использовать это решение с Java 8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...