Eu estou trabalhando com Java 8 Streams
Eu 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:
- Filtrar os registros onde SenderId é inválido (usando um Map <> lookup)
- 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 Idea
levanta o erro
Non-Static method cannot be referenced from static context
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 :
groupingBy
atributos resulta em valores a ser agregada como umList
.o
Collector
definido nocollect
como ele difere de sua tentativa.