fn join<V2, R2>(&self, other: &Collection<G, (K,V2), R2>) -> Collection<G, (K,(V,V2)), <R as Multiply<R2>>::Output>
    where
        K: ExchangeData,
        V2: ExchangeData,
        R2: ExchangeData+Semigroup,
        R: Multiply<R2>,
        <R as Multiply<R2>>::Output: Semigroup+'static
    {
        self.join_map(other, |k,v,v2| (k.clone(),(v.clone(),v2.clone())))
    }
Matches pairs `(key,val1)` and `(key,val2)` based on `key` and yields pairs `(key, (val1, val2))`.

The [`join_map`](Join::join_map) method may be more convenient for non-trivial processing pipelines.

# Examples

```
use differential_dataflow::input::Input;
use differential_dataflow::operators::Join;

::timely::example(|scope| {

let x = scope.new_collection_from(vec![(0, 1), (1, 3)]).1;
let y = scope.new_collection_from(vec![(0, 'a'), (1, 'b')]).1;
let z = scope.new_collection_from(vec![(0, (1, 'a')), (1, (3, 'b'))]).1;

x.join(&y)
.assert_eq(&z);
});
```
differential-dataflow/src/operators/join.rs