GroupingBy usando Java 8 fluxos

iam.Carrot:

Eu estou trabalhando com Java 8 StreamsEu tenho uma classe como a seguir:

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";
    }
}

Agora o que eu estou tentando fazer é, eu quero:

  1. Filtrar os registros onde SenderId é inválido (usando um Map <> lookup)
  2. Grupo da coleção pela SenderId e posteriormente agrupá-los pela shareMode.

Abaixo está o meu código:

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()));

Ele me lança o erro:

Erro: (105, 90) java: nenhum método adequado encontrado para groupingBy (Share [...] gMode, java.util.function.Function) Método java.util.stream.Collectors.groupingBy (java.util.function.Function ) não é aplicável (não se pode inferir-tipo variável (s) de T, K (lista de argumentos reais e formais diferem em comprimento)) método java.util.stream.Collectors.groupingBy (java.util.function.Function, java.util. stream.Collector) não é aplicável (não instância (s) de tipo variável (s) t de modo que existe conforma java.util.function.Function para java.util.stream.Collector) método java.util.stream.Collectors.groupingBy (java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector) não é aplicável (não pode inferir-tipo variável (s) de T, K, D, A, M (real e formal listas de argumentos diferem em comprimento))

Enquanto Intellij Idealevanta o erro

Non-Static method cannot be referenced from static context

também:

Baseado no que você está tentando alcançar

  • Filtrar os registros onde SenderId é inválido (usando um Map <>
    lookup)
  • Grupo da coleção pela SenderId e posteriormente agrupá-los pela shareMode.

em vez disso você pode usar:

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

Nota :

  1. groupingByatributos resulta em valores a ser agregada como um List.

  2. o Collectordefinido no collectcomo ele difere de sua tentativa.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=99008&siteId=1
Recomendado
Clasificación