Collectors.teeing()
احسب تجميعَين في تمريرة واحدة على Stream.
مقارنة الكود
✕ Java 8
long count = items.stream().count();
double sum = items.stream()
.mapToDouble(Item::price)
.sum();
var result = new Stats(count, sum);
✓ Java 12+
var result = items.stream().collect(
Collectors.teeing(
Collectors.counting(),
Collectors.summingDouble(Item::price),
Stats::new
)
);
هل ترى مشكلة في هذا الكود؟ أخبرنا.
لماذا يتفوق الأسلوب الحديث
تمريرة واحدة
تمر على Stream مرة واحدة بدلاً من مرتين.
قابل للتركيب
ادمج أي مُجمِّعَين باستخدام دالة دمج.
نتيجة ثابتة
ادمج مباشرةً في record أو كائن قيمة.
الأسلوب القديم
تمريرتان على البيانات
الأسلوب الحديث
teeing()
منذ JDK
12
الصعوبة
متوسط
دعم JDK
Collectors.teeing()
متاح
متاح على نطاق واسع منذ JDK 12 (مارس 2019)
كيف يعمل
يُرسل Collectors.teeing() كل عنصر إلى مُجمِّعَين فرعيَّين ثم يدمج النتيجتين. يتجنّب هذا تكرار تدفق البيانات مرتين أو استخدام متراكم قابل للتعديل.
توثيق ذو صلة