Como criar List <T> para Map <String, T> em vez de Map <String, List <T >>?

Dmytro Chasovskyi:

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 8maneira de conseguir o mesmo resultado?

Eles foram:

Use toMapem 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 Mappara 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);

Acho que você gosta

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