no no, non come chiave composta.
in sostanza devo creare due grafici:
- in uno metto il numero di libri scritti da ogni autore
- nell'altro metto il numero di libri emessi da ogni editore

quindi quel metodo dovrebbe essere richiamo due volte:
per autori:
codice:
map = list.stream().collect(Collectors.groupingBy(Book::getAuthor, Collectors.counting()));
e per editori:
codice:
map = list.stream().collect(Collectors.groupingBy(Book::getEditor, Collectors.counting()));
quindi sono due grafici separati!

------------------------------------------------------------------------------------------------------

per il secondo quesito, il TypeToken l'ho messo come parametro perchè glielo passo in questo modo (come mi avevi consigliato in un altro thread):
codice:
ReadJson jsonRead = new ReadJson(); 
TypeToken<List<Book>> bookToken = new TypeToken<List<Book>>() { 
}; 
System.out.println(jsonRead.groupJson(new File(UrlAndPath.JSON_LIBRI), bookToken));
giusto per generalizzare il TypeToke che gli passo.