8

In Java 8, can I use streams to filter a partial string?

Let us assume I have a list of animals like:

Brown Bear
Black Bear
Black Crow
Red Herring 
Owl
Sparrow
Blackbacked Flocking Crow

Let us assume all of the Animals names are in a list of Animals Objects

public class Animal{
    public name;
    public animalType;
}

Is there some way to find all of the animals that have Black regardless of the case somewhere in the name. Something like the following...

List<Animal> filtList = employeeList.stream()
    .filter(x -> "%Black%".toUpperCase().equals(x.getLastName().toUpper()))
    .collect(Collectors.toList());
Dale
  • 1,613
  • 4
  • 22
  • 42

2 Answers2

11

There is no toUpper() method for String.

It is toUpperCase() and also you need to use contains() to check "BLACK" there anywhere in the whole string, so the code should be simple as shown below:

List<Employee> filtList = inputList.stream().
         filter(value -> value.toUpperCase().//convert to uppercase for checking
         contains("BLACK")).//filter values containing black
         collect(Collectors.toList());//collect as list
Vasu
  • 21,832
  • 11
  • 51
  • 67
5

Use regex:

List<Animal> filtList = list.stream()
   .filter(x -> x.getName().matches("(?i).*black.*"))
   .collect(Collectors.toList());

The regex flag "(?)" means "ignore case".

Bohemian
  • 412,405
  • 93
  • 575
  • 722