java流式计算Stream

java流式计算Stream

流(Stream)到底是什么呢? 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。

“集合讲的是数据,流讲的是计算! ”

特点:

  1. Stream自己不会存储元素。

  2. Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream。

  3. Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

下面的代码中,需求是要把list集合中的元素全部变成乘以2,就需要使用map的stream流式计算方法,map接受的是一个JDK提供的,Function接口,所以lambda实现方法时需要一个返回值,一个参数。

map----映射(将元素映射成另外的元素)

collect----stream转list

Stream流就相当于java对集合操作的sql语句,可以进行各种类似sql查询筛选的操作。

  • 题目:请按照给出数据,找出同时满足以下条件的用户,也即以下条件全部满足

  • 偶数工D且年龄大于24且用户名转为大写且用户名字母倒排序

  • 只输出一个用户名字

运行结果:

Java使用Flink进行流式计算,可按以下步骤操作: 1. **添加依赖**:若使用Maven,需在`pom.xml`里添加Flink相关依赖,示例如下: ```xml <dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId> <version>1.15.0</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> <version>1.15.0</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-clients-java</artifactId> <version>1.15.0</version> </dependency> </dependencies> ``` 此依赖配置可让项目运用Flink的Java API进行流式计算开发 [^5]。 2. **构建Flink应用程序**:通常要经历获取执行环境、指定数据源、定义转换操作、确定输出位置以及触发程序执行等步骤 [^4]。 ```java import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class FlinkStreamingExample { public static void main(String[] args) throws Exception { // 1. 获取flink应用程序的执行环境对象 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 2. 指定读取数据源 DataStream<String> source = env.socketTextStream("localhost", 9999); // 3. 定义基于数据的转换操作 DataStream<Integer> counts = source .flatMap((String value, Collector<Integer>) -> { for (String word : value.split(" ")) { collector.collect(word.length()); } }) .returns(Integer.class); // 4. 定义计算结果的输出位置 counts.print(); // 5. 触发程序执行 env.execute("Flink Streaming Example"); } } ``` 上述代码是一个简单的Java结合Flink进行流式计算的案例,它从本地的9999端口读取数据,计算每个单词的长度并输出结果。 此外,在流式计算里,Flink的watermark合并机制能正确生成watermark,保证在多个分区的数据流进行shuffle、合并、连接等操作时,时间戳和水位线的处理准确无误。示例如下: ```java import org.apache.flink.streaming.api.functions.timestamps.AscendingTimestampExtractor; import org.apache.flink.streaming.api.datastream.DataStream; class MyEvent { private long creationTime; public MyEvent(long creationTime) { this.creationTime = creationTime; } public long getCreationTime() { return creationTime; } } public class WatermarkExample { public static void main(String[] args) { DataStream<MyEvent> stream = ...; DataStream<MyEvent> withTimestampsAndWatermarks = stream.assignTimestampsAndWatermarks(new AscendingTimestampExtractor<MyEvent>() { @Override public long extractAscendingTimestamp(MyEvent element) { return element.getCreationTime(); } }); } } ``` 此代码展示了如何使用预定义的升序时间戳分配器为数据流添加时间戳和水位线 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向着五星的方向

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值