1. Overview
In this tutorial, we'll look into different ways to search for a String in an ArrayList. Our intent is to check if a specific non-empty sequence of characters is present in any of the elements in the ArrayList and to return a list with all the matching elements.
2. Basic Looping
First, let's use a basic loop to search the sequence of characters in the given search string using the contains method of Java's String class:
public List<String> findUsingLoop(String search, List<String> list) { List<String> matches = new ArrayList<String>(); for(String str: list) { if (str.contains(search)) { matches.add(str); } } return matches; }
3. Streams
The Java 8 Streams API provides us with a more compact solution by using functional operations.
First, we'll use the filter() method to search our input list for the search string, and then, we'll use the collect method to create and populate a list containing the matching elements:
public List<String> findUsingStream(String search, List<String> list) { List<String> matchingElements = list.stream() .filter(str -> str.trim().contains(search)) .collect(Collectors.toList()); return matchingElements; }
4. Third-Party Libraries
If we cannot use the Java 8 Stream API, we can look at third-party libraries such as Commons Collections and Google Guava.
To use them, we just need to add Guava, Commons Collections, or both dependencies in our pom.xml file:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.1</version> </dependency>
4.1. Commons Collections
Commons Collections provides us with a method IterableUtils.filteredIterable() that matches the given Iterable against a Predicate.
Let's call IterableUtils.filteredIterable(), defining the predicate to select only those elements containing the search string. Then, we'll use IteratorUtils.toList() to convert the Iterable to a List:
public List<String> findUsingCommonsCollection(String search, List<String> list) { Iterable<String> result = IterableUtils.filteredIterable(list, new Predicate<String>() { public boolean evaluate(String listElement) { return listElement.contains(search); } }); return IteratorUtils.toList(result.iterator()); }
4.2. Google Guava
Google Guava offers a similar solution to Apache's filteredIterable() with the Iterables.filter() method. Let's use it to filter the list and return only the elements matching our search string:
public List<String> findUsingGuava(String search, List<String> list) { Iterable<String> result = Iterables.filter(list, Predicates.containsPattern(search)); return Lists.newArrayList(result.iterator()); }
5. Conclusion
In this tutorial, we’ve learned different ways of searching for a String in an ArrayList. We first started with a simple for loop and then proceeded with an approach using the Stream API. Finally, we saw some examples using two third-party libraries — Google Guava and Commons Collections.
The complete examples are available over on GitHub.