Eu encontrei com o caso quando eu preciso converter List<Book>
para Map<String, Book>
e as únicas soluções que eu posso encontrar é como fazer Map<String, List<Book>>
.
A classe em si parece da seguinte forma (I ommitted getters / setters e construtores):
public class Book {
private String asin;
private String author;
private String title;
}
Eu quero mapear todos os livros de certas chaves únicas, por isso, a probabilidade de duplicação ou é negligenciável ou 0
.
Tentei fazê-lo desta maneira:
Map<String, Book> booksByAsinAndTitle = books.stream()
.collect(Collectors.groupingBy((book) -> book.getAsin() + "||" + book.getTitle()))
.entrySet()
.stream()
.collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().get(0)));
Ele funciona, mas parece feio, dificilmente legível e não muito bom ter na base de código, pois pode confundir os meus colegas. Existe alguma maneira melhor java 8
maneira de conseguir o mesmo resultado?
Use toMap
em vez de groupingBy
:
Map<String, Book> booksByAsinAndTitle =
books.stream()
.collect(Collectors.toMap(b -> b.getAsin() + "||" + b.getTitle(),
Function.identity()));
Se a chave de acordo com o qual está a agrupar é único, não há nenhuma razão para usar groupingBy
.
Se a sua chave pode não ser único, e você ainda quer o Map
para conter o primeiro valor combinando uma determinada chave, adicionar uma função de mesclagem:
Map<String, Book> booksByAsinAndTitle =
books.stream()
.collect(Collectors.toMap(b -> b.getAsin() + "||" + b.getTitle(),
Function.identity()),
(a,b) -> a);