1. Overview
Java Generics brings us many benefits. Type safety is the significant one. For example, we cannot add an Integer to a List
In this quick tutorial, we’ll explore converting List
2. Preparing a List 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
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
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
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
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
As usual, all code snippets presented here are available over on GitHub.