Hackernoon logoWhat Makes The Teeing Method In The Java API So Cool by@nfrankel

What Makes The Teeing Method In The Java API So Cool

Last week, I described a use-case for a custom Stream-type collector. I received a intriguing comment on Twitter that revealed a method I didn’t know. I decided to investigate what is the                teeeing() method about. The method is a composite of two downstream collectors. Every element passed to the resulting collector is processed by both downstream collectors, then their results are merged using the specified merge function into the final result. The complete source code for this post can be found on Github in Maven format.
image
Nicolas Hacker Noon profile picture

@nfrankelNicolas

Developer Advocate @Hazelcast Blogger at http://blog.frankel.ch Learner Author of http://leanpub.com/integrationtest

Last week, I described a use-case for a custom Stream

Collector
. I received a intriguing comment on Twitter:

image

Hats off to you, Miguel! Your comment revealed a method I didn’t know!

So I decided to investigate what is the

teeing()
method about.

Returns a Collector that is a composite of two downstream collectors. Every element passed to the resulting collector is processed by both downstream collectors, then their results are merged using the specified merge function into the final result.
The resulting collector functions do the following:
* supplier: creates a result container that contains result containers obtained by calling each collector’s supplier
* accumulator: calls each collector’s accumulator with its result container and the input element
* combiner: calls each collector’s combiner with two result containers
* finisher: calls each collector’s finisher with its result container, then calls the supplied merger and returns its result.
JavaDocs

We can indeed replace our custom

Collector
with two simple
Collector
implementations, one aggregating price rows and the other summing the cart’s price.

Let’s look at the final code and explain it line by line.

public PriceAndRows getPriceAndRows(Cart cart) {
  return cart.getProducts()
      .entrySet()
      .stream()
      .map(CartRow::new)                           // 1
      .collect(Collectors.teeing(                  // 2
          Collectors.reducing(                     // 3
              BigDecimal.ZERO,                     // 4
              CartRow::getRowPrice,                // 5
              BigDecimal::add),                    // 6
          Collectors.toList(),                     // 7
          PriceAndRows::new                        // 8
      ));
}
  1. Map each
    Entry
    to a
    CartRow
  2. Call the
    teeing()
    method
  3. The first collector computes the price. It's a simple
    reducing()
    call, with:
  4. The starting element
  5. A function to extract a
    Price
    from a
    CartRow
  6. A
    BinaryOperator
    to add two prices together
  7. The second collector aggregates the
    CartRow
    into a list
  8. Finally, the last parameter creates a new object that aggregates the results from the first and the second collector

On the implementation side,

teeing()
:

  1. Extracts each of the individual components of both
    Collector
    , i.e.,
    supplier()
    ,
    accumulator()
    ,
    combiner()
    and
    finisher()
  2. Pairs them side-by-side
  3. Creates a single new
    Collector
    by passing the pairs

Thus, there will be a single Collector and a single pass in the end.

I hope this post made you consider using

teeing()
before creating a custom
Collector
. Thanks again to Miguel!

By the way, I’m always happy to learn new things. In case you’ve got
insights to share, you can use the commenting system below or Twitter.

The complete source code for this post can be found on Github in Maven format.

To go further:

Originally published at A Java Geek on May 9th, 2021

Nicolas Hacker Noon profile picture
by Nicolas @nfrankel. Developer Advocate @Hazelcast Blogger at http://blog.frankel.ch Learner Author of http://leanpub.com/integrationtestRead all my posts!

Tags

Join Hacker Noon

Create your free account to unlock your custom reading experience.