"If a worker wants to do his job well, he must first sharpen his tools." - Confucius, "The Analects of Confucius. Lu Linggong"
Front page > Programming > How Can I Efficiently Translate Lists to Maps Using Java 8 Streams?

How Can I Efficiently Translate Lists to Maps Using Java 8 Streams?

Posted on 2025-02-06
Browse:689

How Can I Efficiently Translate Lists to Maps Using Java 8 Streams?

Translating Lists to Maps Efficiently with Java 8 Streams

In Java 8, a common task is to convert a list of objects into a map using streams and lambdas. This can be achieved in various ways, depending on the desired behavior and the availability of third-party libraries like Guava.

Java 7 and Below Approach

Traditionally, mapping a list to a map involved manual iteration and a handwritten loop:

private Map nameMap(List choices) {
    final Map hashMap = new HashMap();
    for (final Choice choice : choices) {
        hashMap.put(choice.getName(), choice);
    }

    return hashMap;
}

Guava-Based Solutions

Guava provides a convenient method, Maps.uniqueIndex, for generating maps from lists based on a specified key extractor.

Guava with Java 7

private Map nameMap(List choices) {
    return Maps.uniqueIndex(choices, new Function() {

        @Override
        public String apply(final Choice input) {
            return input.getName();
        }

    });
}

Guava with Java 8 Lambdas

Leveraging Java 8 lambdas simplifies the code even further:

private Map nameMap(List choices) {
    return Maps.uniqueIndex(choices, Choice::getName);
}

Collectors to the Rescue

Java 8's Collectors class offers a robust implementation for mapping lists to maps. The toMap collector takes two arguments:

  • A key extractor function (a function that retrieves the key for each element)
  • A value extractor function (a function that retrieves the value for each element)

In this case, we can use Choice::getName and Function.identity() to retrieve the key and value, respectively:

Map result =
    choices.stream().collect(Collectors.toMap(Choice::getName,
                                              Function.identity()));
Latest tutorial More>

Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.

Copyright© 2022 湘ICP备2022001581号-3