ترمینال اپراتورها در فلوها عملیاتی هستند که به واقع فلو را خاتمه میدهند . این اپراتورها اجازه میدهند تا مقادیر را از فلوها جمع آوری کنید و انجام عملیاتهای مختلفی روی آنها داشته باشید.
مهمترین ترمینال اپراتور collect
است که به عنوان گردآورنده عمل میکند. این اپراتور اجازه میدهد تا مقادیری که در فلوها تولید شدهاند را جمع آوری کنید و آنها را به صورت مشخص چاپ یا استفاده دیگری از آنها داشته باشید.
همچنین ترمینال اپراتورها میتوانند عملیاتی مانند کاهش (reduce) را اعمال کنند که به ازای هر آیتم ارسالی یک تابع مشخص را اعمال میکنند و نهایتاً یک مقدار نهایی را ارسال میکنند.
به عنوان مثال، در کد زیر، ما از ترمینال اپراتور collect
برای جمعآوری مقادیر از یک فلو استفاده میکنیم:
(1..5).asFlow()
.filter {
it % 2 == 0
}
.map {
it * it
}
.collect {
Log.d(TAG, it.toString())
}
در این مثال، با استفاده از ترمینال اپراتور collect
، ما مقادیری که از فلو تولید شدهاند را جمعآوری کرده و آنها را به صورت مشخص چاپ میکنیم.
بنابراین، ترمینال اپراتورها اساسیترین بخش از یک فلو هستند که با استفاده از آنها میتوانید مقادیر را جمع آوری کرده و با آنها کار کنید.
پس، اگر شما فقط خط زیر را بنویسید، فلو آغاز نمیشود:
(1..5).asFlow()
.filter {
it % 2 == 0
}
.map {
it * it
}
شما باید از عملگر ترمینال برای شروع آن استفاده کنید، در این مورد، collect
.
حالا بیایید عملگر ترمینال دیگری را که عملگر کاهش (reduce) است ببینیم.
در عملگر کاهش، یک تابع به هر آیتم ارسال شده اعمال میشود و مقدار نهایی را ارسال میکند. به عنوان مثال:
val result = (1..5).asFlow() .reduce { a, b -> a + b } Log.d(TAG, result.toString())
در اینجا، نتیجه 15 خواهد بود.
خب در مورد این عملگر توضیحاتی بدم :
در مرحله اولیه، داریم 1، 2، 3، 4، 5 که قرار است ارسال شوند.
اولاً، a = 0 و b = 1 است که بر اساس مراحل، تغییر میکنند.
مرحله 1:
a = 0، b = 1
a = a + b = 0 + 1 = 1
مرحله 2:
a = 1، b = 2
a = a + b = 1 + 2 = 3
و غیره...
در نهایت، مقدار نهایی به عنوان 15 خواهد بود.