代码如下:
public class KeyedStreamExample {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
DataStream<SensorReading> stream = env.addSource(new SensorSource());
stream
.map(r -> new Tuple2<String, Double>(r.id, r.temperature))
.filter(r -> r.f0.equals("sensor_1"))
.keyBy(r -> r.f0)
.reduce((ReduceFunction<Tuple2<String, Double>>) (t1, t2) -> {
if (t1.f1 > t2.f1) {
return t1;
} else {
return t2;
}
})
.print();
env.execute();
}
}
经查,报错的原因是由于Tuple2是flink中提供的类型,Java无法自动推断,因此要在reduce算子后面追加一句话:
.reduce((ReduceFunction<Tuple2<String, Double>>) (t1, t2) -> {
if (t1.f1 > t2.f1) {
return t1;
} else {
return t2;
}
})
.returns(TypeInformation.of(new TypeHint<Tuple2<String, Double>>() {}))
显式告诉编译器返回值类型。