MultiStepCombine extends RawPTransform<PCollection<KV<K, InputT>>, PCollection<KV<K, OutputT>>> { private MultiStepCombine( CombineFn<InputT, AccumT, OutputT> combineFn, Coder<KV<K, OutputT>> outputCoder) { this.combineFn = combineFn; this.outputCoder = outputCoder; } private  MultiStepCombine(
      CombineFn<InputT, AccumT, OutputT> combineFn, Coder<KV<K, OutputT>> outputCoder); static PTransformMatcher matcher(); static MultiStepCombine<K, InputT, AccumT, OutputT> of(
          CombineFn<InputT, AccumT, OutputT> combineFn, Coder<KV<K, OutputT>> outputCoder); @Override @NonNull String getUrn(); @Override @Nullable FunctionSpec getSpec(); @Override PCollection<KV<K, OutputT>> expand(PCollection<KV<K, InputT>> input);  }
@Test public void testMultiStepCombine() { PCollection<KV<String, Long>> combined = pipeline .apply( Create.of( KV.of("foo", 1L), KV.of("bar", 2L), KV.of("bizzle", 3L), KV.of("bar", 4L), KV.of("bizzle", 11L))) .apply(Combine.perKey(new MultiStepCombineFn())); PAssert.that(combined) .containsInAnyOrder(KV.of("foo", 1L), KV.of("bar", 6L), KV.of("bizzle", 14L)); pipeline.run(); }