Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

Java Generics brings us many benefits. Type safety is the significant one. For example, we cannot add an Integer to a List<String>. Therefore, when we work with generic collections, we often want to convert Collection<TypeA> to Collection<TypeB>.

In this quick tutorial, we’ll explore converting List<String> to List<Integer>.

2. Preparing a List<String> Instance as the Input Example

First of all, let’s first initialize a list of strings as the input:

List<String> STRING_LIST = Arrays.asList("1", "2", "3", "4", "5", "6", "7")

As we can see, the list object carries seven strings. We want to convert each string element in STRING_LIST to an Integer, for example, “1″ to 1, “2″ to 2, and so on. As a result, we’ll get a List<Integer> that is equal to:

List<Integer> EXPECTED_LIST = Arrays.asList(1, 2, 3, 4, 5, 6, 7);

In this tutorial, we’ll address three different ways to do that:

  • Using Java 8’s Stream API
  • Using a Java for loop
  • Using the Guava library

For simplicity, we’ll use unit test assertions to verify whether our conversions work as expected.

Next, let’s dive in.

3. Using the map() Method From the Stream API

Java Stream API provides many convenient interfaces and lets us easily handle Collections as streams. It is available on Java 8 and later versions. Nowadays, when we work on a new Java project, it likely uses Java 8 or a later version. Therefore, we’ll look at the Stream API approach first.

One of the API’s handy methods is map(). We can simply convert List<TypeA> to List<TypeB> using the map() method:

someList.stream().map( .. the conversion logic.. ).collect(Collectors.toList());

The ” .. the conversion logic .. ” above can be a method reference or a lambda expression.

So next, let’s see how to use the map() method to convert List<String> to List<Integer>:

List<Integer> result = STRING_LIST.stream()
  .map(Integer::valueOf)
  .collect(Collectors.toList());

assertEquals(EXPECTED_LIST, result);

In the code example above, we pass a method reference “Integer::valueOf” to map(). There are various ways to convert a String to an Integer. Here, for simplicity, we call Integer.valueOf() on each string element.

If we run it, the test passes. So, Stream‘s map() method solves the problem.

4. Using a for Loop

We’ve seen that Stream‘s map() method can solve the problem. However, as we’ve mentioned, the Stream API is only available in Java 8 and later versions. Therefore, we cannot use the Stream API if we’re working with an older Java version. So, we need to solve the problem differently.

Next, let’s do the conversion through a simple for loop:

List<Integer> result = new ArrayList<>(STRING_LIST.size());
for (String s : STRING_LIST) {
    result.add(Integer.valueOf(s));
}

assertEquals(EXPECTED_LIST, result);

The code above shows that we first create a new List<Integer> object, result. Then, we iterate elements from the List<String> list in a for loop, convert each String element to Integer, and add the integer to the result list.

The test passes if we give it a run.

5. Using the Guava Library

As we often need to convert a collection’s type when we work with collections, some popular external libraries have provided utility methods to do the conversion.

In this section, we’ll use Guava to show how to solve our problem.

First, let’s add the Guava library dependency in the pom.xml:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>32.0.1-jre</version>
</dependency>

Of course, we can check for the latest version in the Maven Central repository.

Next, let’s use Guava’s Lists.transform() method to solve our problem. As the name implies, the transform() method can transform a collection to a different type using a provided “transform function”:

List<Integer> result = Lists.transform(STRING_LIST, new Function<String, Integer>() {
    @Override
    public Integer apply(String input) {
        return Integer.valueOf(input);
    }
});

assertEquals(EXPECTED_LIST, result);

As we can see, we passed an anonymous Function object as the “transform function”. It instructs the transform() method on how to apply the conversion. Again, we call Integer.valueOf() to convert each String to an Integer.

The test passes if we run it.

6. Conclusion

In this short article, we’ve learned three ways to convert List<String> to List<Integer>. Stream API would be the most straightforward conversion method if we work with Java 8 or a later version. Otherwise, we can apply the conversion through a loop or turn to an external library, such as Guava.

As usual, all code snippets presented here are available over on GitHub.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.