Filtering a list of customers in Java based on three criteria
As far as which is easier to read, there isn't a clearly correct answer. The second is more shorter, but more cramped. I personally prefer code with a little more whitespace, such as the first example. Others prefer code that's more succinct. Which is more readable is probably a question to ask your coworkers.

Marking variables as final will clue the reader in that they don't change once assigned.

In camelCase, the method name should be filterStepByStep.

Both methods use lambdas, so the name filterWithLambda is misleading.

In recent versions of Java, you don't need to specify the type on the right hand side of a generic assignment. You can just use &lt;&gt;.

You can get rid of 'valid' by returning false early.

The equals check for locations can be cleaned up using customer.locationId::equals, or, better, by just using contains.

The check on tags can be cleaned up using Set operations.

I would consider renaming the variables to matchCustomerName, matchLocation, and matchTags to make the checks read more cleanly.

If you were to make all these changes, your code might look more like:

public static List&lt;Customer&gt; filterStepByStep(
        final List&lt;Customer&gt; customers,
        final String searchString,
        final List&lt;Tag&gt; selectedTags,
        final List&lt;LocationId&gt; selectedLocations) {

    final List&lt;Customer&gt; filteredCustomers = new ArrayList&lt;&gt;(customers);
    final boolean matchCustomerName = searchString != null &amp;&amp; !searchString.trim().isEmpty();
    final boolean matchLocation = selectedLocations != null &amp;&amp; selectedLocations.size() &gt; 0;
    final boolean matchTags = selectedTags != null &amp;&amp; selectedTags.size() &gt; 0;


    filteredCustomers.removeIf(customer -&gt; {
        if (matchCustomerName &amp;&amp; !customer.name.contains(searchString)) {
            return true;
        }

        if (matchLocation &amp;&amp; !selectedLocations.contains(customer.locationId)) {
            return true;
        }

        if (matchTags) {
            final Set&lt;Tag&gt; matchedTags = new HashSet&lt;&gt;(selectedTags);
            matchedTags.retainAll(customer.getTags());
            return matchedTags.isEmpty();
        }

        return false;
    });

    return filteredCustomers;
}

public List&lt;Customer&gt; filterWithLambda(
        final List&lt;Customer&gt; customers,
        final String searchString,
        final List&lt;Tag&gt; selectedTags,
        final List&lt;LocationId&gt; selectedLocations) {

    final List&lt;Customer&gt; filteredCustomers = new ArrayList&lt;&gt;(customers);
    final boolean matchCustomerName = searchString != null &amp;&amp; !searchString.trim().isEmpty();
    final boolean matchLocations = selectedLocations != null &amp;&amp; selectedLocations.size() &gt; 0;
    final boolean matchTags = selectedTags != null &amp;&amp; selectedTags.size() &gt; 0;

    filteredCustomers.removeIf(customer -&gt; {
        return (matchCustomerName &amp;&amp; !customer.name.contains(searchString))
                || (matchLocations &amp;&amp; !selectedLocations.contains(customer.locationId))
                || (matchTags &amp;&amp; !selectedTags.stream().anyMatch(customer.getTags()::contains));
    });

    return filteredCustomers;
}