Группировка с использованием потоков Java 8 - PullRequest
0 голосов
/ 23 февраля 2019

Я работаю с Java 8 Streams У меня есть класс, как показано ниже:

public class ShareDao {
    private String senderId;
    private String receiverId;

    public String getSenderId() {
        return senderId;
    }

    public String sharingMode(){
        return this.receiverId != null && !this.receiverId.trim().isEmpty() ? "incoming" : "outgoing";
    }
}

Теперь я пытаюсь сделать следующее:

  1. Отфильтроватьзаписи, в которых senderId является недопустимым (с использованием поиска Map <>)
  2. Сгруппируйте коллекцию по senderId, а затем сгруппируйте их по shareMode.

Ниже приведен мой код:

Map<String, Map<String, List<ShareDao>>> p = records.stream()
            .filter(shared -> userMap.containsKey(shared.getSenderId()))
            .collect(Collectors.groupingBy(ShareDao::getSenderId), Collectors.groupingBy(ShareDao::sharingMode, Function.identity()));

Выдает ошибку:

Ошибка: (105, 90) Java: не найден подходящий метод для groupingBy (Share [...] gMode, java.util.function.Function) метод java.util.stream.Collectors.groupingBy (java.util.function.Function) не применяется (не может вывести переменные типа (типов) T, K (фактические и формальные списки аргументов различаются по длине))Метод java.util.stream.Collectors.groupingBy (java.util.function.Function, java.util.stream.Collector) не применим (не существует экземпляров (экземпляров) переменной типа (типов) T, так что java.util.function.Function соответствует java.util.stream.Collector) методу java.util.stream.Collectors.groupingBy (java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector) не применяется (не может выводить переменные типа (типов) T, K, D, A, M (фактические и формальные списки аргументов различаются по длине))

Пока Intellij Idea выдает ошибку

Non-Static method cannot be referenced from static context

1 Ответ

0 голосов
/ 23 февраля 2019

В зависимости от того, чего вы пытаетесь достичь

  • Отфильтруйте записи, в которых senderId недопустим (с использованием поиска Map <>
    )
  • Groupсбор по senderId, а затем сгруппировать их по shareMode.

вместо этого можно использовать:

Map<String, Map<String, List<ShareDao>>> p = records.stream()
        .filter(shared -> userMap.containsKey(shared.getSenderId())) // filter records
        .collect(Collectors.groupingBy(ShareDao::getSenderId, // grouping by senderId
                Collectors.groupingBy(ShareDao::sharingMode)));  //further grouping by sharingMode

Примечание Атрибуты :

  1. groupingBy приводят к агрегированию значений в виде List.

  2. Collector, определенного вcollect в отличие от вашей попытки.

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