java window_RxJava window操作符<三零>

原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%204%20-%20Concurrency/3.%20Sequences%20of%20coincidence.md

Sequences of coincidence

Rx试图避免管道(pipeline)外的状态,但是,有些事情本质上是有状态的。比如服务器可以启动或关闭,移动设备可以访问wifi,按下按钮。在Rx中,我们将这些视为具有一段持续时间的事件,我们称之为窗口(windows)。在这些窗口内发生的其他事件可能需要区别对待。例如,移动设备将推迟低优先级的网络请求,同时使用更昂贵的通信通道。

Window

使用缓冲区(buffer),我们可以看到一个操作符,它可以根据各种重载,将序列和组值转换为块。窗口运算符与缓冲区具有一对一的关系。主要区别在于它不会以缓冲块的形式返回组。相反,它返回一系列序列,每个序列对应于本来是缓冲区的序列。这意味着每个发出的observable一旦出现在source observable中就会发出它的值,而不是在窗口的末尾发出它们。通过下面的图,可以立即看出缓冲区和窗口之间的关系:

0ffea4f2c82fbd7feee7550d0eb3e0d5.png

使用window操作后:

b0ced24c059f6411114934bcf65136b2.png

如果您还不熟悉缓冲区(buffer),我强烈建议您从此开始。两个运算符中的重载和结果分组是相同的,但缓冲区更容易理解并提供示例。可以使用相同的参数从窗口重载构造每个缓冲区重载:

415257ac3bc7e964ee5b62245e969dc5.png

Window by count

您可以拥有固定数量元素的窗口。一旦窗口发出了所需数量的元素,则observable终止并开始新的元素。

8b5287ac44182a9e40b4f51d86091f0f.png

您也可以跳过和重叠窗口像带有window(int count,int skip)的buffer一样。当窗口重叠时,它们将同时发射值,如下一个示例所示。

04f12a3cae1d1a171b9b7b2a8cb1eb82.png

输出:

1276f7fe674d1e199283936cfe598d68.png

我们可以在这里看到内部可观察者同时发射相同的值。为了更清楚地看到每个observable发出的内容,让我们以不同的方式格式化输出:

74a7d204131aad89e8539c86beb76c5e.png

输出:

0952f550669fd135fb6a98c75d2a9cff.png

通过将内部可观察量转换为列表,我们可以看到相关窗口与缓冲区的关系。

Window by time

您可以拥有固定持续时间的窗口,而不是拥有固定大小的窗口。

0e37d12993394dffc2c8757e7559c183.png

您可以构建重叠或跳过元素的windows,就像使用buffer一样

public final Observable> window(long timespan, long timeshift, java.util.concurrent.TimeUnit unit)

3857a0450e257cea9b72fe60f7da4c2e.png

输出:

ddef346662f8ceb4c4691018456c8f49.png

在此示例中,新的window每100ms开始一次,持续250ms。第一个window在0ms时打开并保持打开足够长的时间以捕获[0,1](间隔在100ms时发出第一个值)。每个后续窗口保持打开足够长的时间以捕获接下来的3个值,除非值停止。

Window with signal

最后,您可以使用另一个observable定义window。每当您的信号可观察值发出一个值时,旧窗口关闭,一个新窗口开始。

5a3239bf544609cf90950ff3b4bef0a4.png

或者,要具有重叠窗口,您可以提供一个函数,该函数使用信号可观察信号发出的值来构造另一个可以发出窗口关闭信号的observable。当observable终止时,相应的窗口关闭。

03a527d66748cb0ab67ac840f5bcb90e.png

这是一个基于信号可观察量的重叠窗口的示例

16ca9ffa569d4df9b4aca91c14c8355f.png

输出:

0403cb369901af86ef1635af35631390.png

此示例与前一示例相同:新window每100ms打开一次,持续250ms,但第一个窗口以100ms而不是0ms开始。但是,我们看到结果有所不同。从时间100ms开始的窗口不会捕获在100ms处发出的值,并且每隔一个窗口都会发生相同的值。发生这种情况是因为窗口开始的间隔事件恰好在作为值的间隔事件之后触发。尽管这两个事件在理论上是同时发生的,但实际上并没有这样的事情。

未完待续!

原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%204%20-%20Concurrency/3.%20Sequences%20of%20coincidence.md

git:https://github.com/woshiyexinjie/rxjava-leaner

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
class ExcelApp: def init(self, master): self.master = master master.title("Excel App") # 创建菜单栏 menubar = tk.Menu(master) master.config(menu=menubar) # 创建工具栏 toolbar = tk.Frame(master, height=30) tk.Button(toolbar, text="打开", command=self.open_file).pack(side=tk.LEFT, padx=2, pady=2) tk.Button(toolbar, text="保存", command=self.save_file).pack(side=tk.LEFT, padx=2, pady=2) toolbar.pack(side=tk.TOP, fill=tk.X) def show_sheet(self, sheet_name): self.textbox.tag_configure("left", justify="left") sheet = self.workbook[sheet_name] rows = sheet.max_row # 清空文本框 self.textbox.delete(1.0, tk.END) # 添加表名并设置居中标签 self.textbox.insert(tk.END, sheet_name + ":\n", "center") # 显示工作表内容,并在相应数据后面添加下拉输入框 for row in sheet.iter_rows(values_only=True): for i, cell in enumerate(row): line = str(cell) + "\t" if i == 0: # 在第一列数据后面添加下拉输入框 combobox = tk.ttk.Combobox(self.textbox, values=["下拉选项1", "下拉选项2", "下拉选项3"]) combobox.pack(side=tk.TOP, padx=10, pady=5) self.textbox.window_create(tk.END, window=combobox) self.textbox.insert(tk.END, line, "left") self.textbox.insert(tk.END, "\n") # 设置居中标签的样式 self.textbox.tag_configure("center", justify="center", font=("Arial", 14, "bold"))根據這段代碼,儅用戶在點擊保存時,將文本框中第一行内容單獨寫入一個excel第一列中,在將文本框中顯示的數據内容和下拉輸入框的内容分別寫入excel第二列第3列中按行寫入
最新发布
05-26

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值