Reports stream API call chains which can be simplified. It allows to avoid creating redundant temporary objects when traversing a collection.

The following call chains are replaced by this inspection:

Note that the replacements semantic may have minor difference in some cases. For example, Collections.synchronizedList(...).stream().forEach() is not synchronized while Collections.synchronizedList(...).forEach() is synchronized. Or collect(Collectors.maxBy()) would return an empty Optional if the resulting element is null while Stream.max() will throw NullPointerException in this case.