title: Logging the result of filter while using java streams filter by predicate
body: <p>The scenario is there are different types of filters I have created which filters the list of some objects based on the property of the object.  </p>
  
  <p>So for that I have created an AbstractObjectFilter class which inherited by every filter.<br>
  AbstractObjectFilter.java</p>
  
  <pre><code>public abstract class AbstractEventFilter
  {
      protected abstract Predicate&lt;IEvent&gt; isEligible();
  
      public List&lt;IEvent&gt; getFilteredEvents(final List&lt;IEvent&gt; events)
      {
          return events.stream().filter(isEligible()).collect(Collectors.toList());
      }
  }
  </code></pre>
  
  <p>So now every filter extends this class and overrides the isEligible() and in that function it returns the predicate based on its properties.</p>
  
  <p>For eg:- 
  MinNumOfPrizesFilter.java  </p>
  
  <pre><code>public class MinimumNumOfPrizesFilter extends AbstractEventFilter
  {
      private int minimumNumOfPrizes;
  
      public MinimumNumOfPrizesFilter(@NonNull int minimumNumOfPrizes)
      {
          this.minimumNumOfPrizes = minimumNumOfPrizes;
      }
  
      @Override
      protected Predicate&lt;IEvent&gt; isEligible()
      {
          return event -&gt; event.getPrizeCount() &gt;= minimumNumOfPrizes;
      }
  }
  </code></pre>
  
  <p>Similarly there are many other filters I have created. There is one applyFilter function which iterate over the list of filter objects and keep applying filter by call getFilteredEvents function.</p>
  
  <p>Now how can i log the fate of each event For example - "x1 event was filtered by MinNumOfPrizesFilter filter. x1's prize count - 10 , required min prize count - 20" </p>