title: Strange "reduce" method group in JDK8 bulk collection operations library
body: <p>Why does the new JDK8 <a href="http://lambdadoc.net/api/java/util/stream/Stream.html" rel="noreferrer"><code>Stream</code></a> class contain only the following <code>reduce</code> methods:</p>
  
  <pre><code>T reduce(BinaryOperator&lt;T&gt; reducer)
  T reduce(T identity, BinaryOperator&lt;T&gt; reducer)
  U reduce(U identity, BiFunction&lt;U, ? super T, U&gt; reducer, 
      BinaryOperator&lt;U&gt; combiner)
  </code></pre>
  
  <p>but not an obvious method which corresponds to <code>reduce</code>/<code>fold</code> functions found in other languages (e.g. Haskell <code>foldl :: (a -&gt; b -&gt; a) -&gt; a -&gt; [b] -&gt; a</code>) and which could look like this:</p>
  
  <pre><code>U reduce(U identity, BiFunction&lt;U, ? super T, U&gt; reducer)
  </code></pre>
  
  <p>?</p>
  
  <p>Instead there is a similar method which has an extra <code>combiner</code> argument. I'm not even sure how to use it since the API documentation I linked to above does not use this argument in the example, it only mentions its required properties.</p>
  
  <p>Why are the JDK8 methods made like this, and how can I emulate standard <code>fold</code> behavior with them?</p>