Поток и фильтр SortedMap - PullRequest
       26

Поток и фильтр SortedMap

2 голосов
/ 11 октября 2019

Я уверен, что это просто, но по какой-то причине я не получаю то, что хочу.

У меня есть SortedMap<String, String> значения, и я хочу передать и отфильтровать его и сохранить только некоторые значения.

Например:

    SortedMap<String, String> input = new TreeMap<>();
    values.put("accepted.animal", "dog");
    values.put("accepted.bird", "owl");
    values.put("accepted.food", "broccoli");
    values.put("rejected.animal", "cat");
    values.put("rejected.bird", "eagle");
    values.put("rejected.food", "meat");

Я хочу только сохранить значения, которые содержат «принято», в ключе и отбросить все остальное.

Итак, результат будет:

{accepted.animal=dog, accepted.bird=owl, accepted.food=broccoli}

Как мне пройти по карте и отфильтровать все, кроме ключей, которые содержат «принято»?

Вот чтоЯ попытался:

private SortedMap<String, String> process(final Input input) {
    final SortedMap<String, String> results = new TreeMap<>();

    return input.getInputParams()
                .entrySet()
                .stream()
                .filter(params -> params.getKey().contains("accepted"))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
} 

Но это не удается из-за "Нестатический метод не может быть ссылка из статического контекста".

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Вам нужно использовать другой вариант Collectors.toMap, так что вы передаете функцию слияния и поставщика для сбора в виде TreeMap там:

return input.getInputParams()
        .entrySet()
        .stream()
        .filter(params -> params.getKey().startsWith("accepted")) // small change
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                (a, b) -> b, TreeMap::new));
2 голосов
/ 11 октября 2019

В конечном счете, метод не компилируется, потому что Collectors.toMap() возвращает Map, тогда как для сигнатуры метода требуется тип возврата SortedMap.

Я не знаю причину этого заблуждения "статический контекст »сообщение об ошибке;но когда я пытаюсь построить код с помощью Gradle, я получаю немного более полезное сообщение.

error: incompatible types: inference variable R has incompatible bounds .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); ^ equality constraints: Map<K,U> lower bounds: SortedMap<String,String>,Object

Возможно, вы хотите перегруженныйверсия Collectors.toMap(), которая принимает Supplier<Map>, так что вы можете предоставить SortedMap для вывода.

...