البرمجة

Java 8 Streams: Summing Items Grouped by ID

المطلوب هو استخدام Java 8 Streams API لحساب مجموع الكميات لكل عنصر مماثل في قائمة من القوائم. تحتاج إلى تجميع البيانات حسب معرف العنصر وحساب المجموع لكل عنصر عبر القوائم المختلفة. للقيام بذلك، يمكننا استخدام دمج العمليات مع Streams API لتحقيق الغرض المطلوب.

أولاً، يجب علينا تعريف وظيفة تقوم بدمج الكميات لنفس العنصر. ثم، سنقوم بتطبيق هذه الوظيفة على كل عنصر في كل قائمة، ثم نقوم بتجميع النتائج باستخدام تجميع البيانات حسب معرف العنصر.

اليك الشفرة التالية التي تقوم بذلك:

java
import java.math.BigDecimal; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Streams { static class PurchaseItemCancellation { private Integer id; private BigDecimal quantity; public PurchaseItemCancellation(Integer id, BigDecimal quantity) { this.id = id; this.quantity = quantity; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public BigDecimal getQuantity() { return quantity; } public void setQuantity(BigDecimal quantity) { this.quantity = quantity; } } static class PurchaseCancellation { private Integer id; private List purchaseItemsCancellations; public PurchaseCancellation(Integer id, List purchaseItemsCancellations) { this.id = id; this.purchaseItemsCancellations = purchaseItemsCancellations; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public List getPurchaseItemsCancellations() { return purchaseItemsCancellations; } public void setPurchaseItemsCancellations(List purchaseItemsCancellations) { this.purchaseItemsCancellations = purchaseItemsCancellations; } } public static void main(String... args) { PurchaseItemCancellation item1 = new PurchaseItemCancellation(1, new BigDecimal("10.00")); PurchaseItemCancellation item2 = new PurchaseItemCancellation(2, new BigDecimal("20.00")); PurchaseItemCancellation item3 = new PurchaseItemCancellation(3, new BigDecimal("30.00")); PurchaseItemCancellation item4 = new PurchaseItemCancellation(4, new BigDecimal("40.00")); PurchaseCancellation purchaseCancellation1 = new PurchaseCancellation(1, List.of(item1, item2)); PurchaseCancellation purchaseCancellation2 = new PurchaseCancellation(2, List.of(item3, item4)); PurchaseCancellation purchaseCancellation3 = new PurchaseCancellation(3, List.of(item4, item1)); List cancellations = List.of(purchaseCancellation1, purchaseCancellation2, purchaseCancellation3); final Comparator byID = Comparator.comparing(PurchaseItemCancellation::getId); Map summedQuantities = cancellations.stream() .flatMap(cancellation -> cancellation.getPurchaseItemsCancellations().stream()) .collect(Collectors.groupingBy(PurchaseItemCancellation::getId, Collectors.mapping(PurchaseItemCancellation::getQuantity, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))); summedQuantities.forEach((id, quantity) -> System.out.println("id: " + id + ", quantity: " + quantity)); } }

هذه الشفرة تقوم بالتالي:

  1. تستخدم Java 8 Streams API لتقليل التعقيد في عملية الحساب.
  2. تستخدم دوال الجمع والتحويل والتجميع لجمع الكميات لكل عنصر.
  3. تقوم بطباعة النتائج للتحقق من صحتها.

بعد تنفيذ الشفرة، يجب أن ترى النتائج المتوقعة كما هو مطلوب في المثال الخاص بك.

المزيد من المعلومات

بالطبع، سأوفر المزيد من المعلومات حول الشفرة والطريقة التي تعمل بها:

  1. الفئات الداخلية (Inner Classes): في الشفرة المقدمة، تم استخدام فئتين داخليتين، وهما PurchaseItemCancellation وPurchaseCancellation. تستخدم هذه الفئات لتمثيل بيانات الإلغاء والعناصر المشتراة الملغاة على التوالي.

  2. Java 8 Streams API: تم استخدام Streams API لتبسيط عملية التحليل والمعالجة للبيانات. باستخدام stream() وflatMap() وcollect() ودوال أخرى من Streams API، يمكن فصل وتحليل البيانات بطريقة سهلة وفعالة.

  3. دمج العمليات (Flattening Operations): باستخدام flatMap()، تم فتح القوائم المتداخلة لإجراء عمليات الاستخراج والمعالجة على كل عنصر بشكل منفصل. هذا يسمح بتحقيق العمليات المطلوبة بشكل فعال.

  4. تحليل البيانات وتجميعها (Data Processing and Aggregation): تم استخدام Collectors.groupingBy() وCollectors.mapping() وCollectors.reducing() لتجميع البيانات وتحليلها حسب الاحتياجات المحددة. يتم تقسيم البيانات بواسطة معرف العنصر، ثم يتم حساب مجموع الكميات لكل عنصر.

  5. الطباعة والتحقق: يتم طباعة النتائج النهائية باستخدام forEach() للتحقق من صحتها ومطابقتها للمتوقع.

هذه المعلومات توضح كيف تم تنفيذ الشفرة لتحقيق الغرض المطلوب، بما في ذلك الاستفادة الكاملة من Java 8 Streams API وتقنيات تحليل البيانات والتجميع.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر