আমার কাছে বিগডিসিমালসের একটি সংকলন রয়েছে (এই উদাহরণে, ক LinkedList
) যা আমি একসাথে যুক্ত করতে চাই। এর জন্য স্ট্রিম ব্যবহার করা কি সম্ভব?
আমি লক্ষ করেছি Stream
ক্লাসের বিভিন্ন পদ্ধতি রয়েছে
Stream::mapToInt
Stream::mapToDouble
Stream::mapToLong
যার প্রতিটি একটি সুবিধাজনক sum()
পদ্ধতি আছে। তবে, যেমনটি আমরা জানি, float
এবং double
গণিত প্রায় সবসময়ই একটি খারাপ ধারণা।
সুতরাং, বিগডিসিমালগুলি যোগ করার কোনও সুবিধাজনক উপায় আছে কি?
আমার এখন পর্যন্ত এই কোডটি।
public static void main(String[] args) {
LinkedList<BigDecimal> values = new LinkedList<>();
values.add(BigDecimal.valueOf(.1));
values.add(BigDecimal.valueOf(1.1));
values.add(BigDecimal.valueOf(2.1));
values.add(BigDecimal.valueOf(.1));
// Classical Java approach
BigDecimal sum = BigDecimal.ZERO;
for(BigDecimal value : values) {
System.out.println(value);
sum = sum.add(value);
}
System.out.println("Sum = " + sum);
// Java 8 approach
values.forEach((value) -> System.out.println(value));
System.out.println("Sum = " + values.stream().mapToDouble(BigDecimal::doubleValue).sum());
System.out.println(values.stream().mapToDouble(BigDecimal::doubleValue).summaryStatistics().toString());
}
আপনি দেখতে পাচ্ছেন যে, আমি বিগডিসিমালগুলি ব্যবহার করে সংক্ষিপ্ত করছি BigDecimal::doubleValue()
, তবে এটি (প্রত্যাশিত হিসাবে) সুনির্দিষ্ট নয়।
উত্তর উত্তর পোস্ট করুন
উভয় উত্তর অত্যন্ত সহায়ক ছিল। আমি কিছুটা যুক্ত করতে চেয়েছিলাম: আমার বাস্তব জীবনের দৃশ্যে কাঁচা সংগ্রহ করা জড়িত না BigDecimal
, সেগুলি একটি চালানে জড়িত । তবে, আমি map()
স্ট্রিমের জন্য ফাংশনটি ব্যবহার করে আমান অগ্নিহোত্রীর জবাবদিহিটি পরিবর্তন করতে পেরেছিলাম :
public static void main(String[] args) {
LinkedList<Invoice> invoices = new LinkedList<>();
invoices.add(new Invoice("C1", "I-001", BigDecimal.valueOf(.1), BigDecimal.valueOf(10)));
invoices.add(new Invoice("C2", "I-002", BigDecimal.valueOf(.7), BigDecimal.valueOf(13)));
invoices.add(new Invoice("C3", "I-003", BigDecimal.valueOf(2.3), BigDecimal.valueOf(8)));
invoices.add(new Invoice("C4", "I-004", BigDecimal.valueOf(1.2), BigDecimal.valueOf(7)));
// Classical Java approach
BigDecimal sum = BigDecimal.ZERO;
for(Invoice invoice : invoices) {
BigDecimal total = invoice.unit_price.multiply(invoice.quantity);
System.out.println(total);
sum = sum.add(total);
}
System.out.println("Sum = " + sum);
// Java 8 approach
invoices.forEach((invoice) -> System.out.println(invoice.total()));
System.out.println("Sum = " + invoices.stream().map((x) -> x.total()).reduce((x, y) -> x.add(y)).get());
}
static class Invoice {
String company;
String invoice_number;
BigDecimal unit_price;
BigDecimal quantity;
public Invoice() {
unit_price = BigDecimal.ZERO;
quantity = BigDecimal.ZERO;
}
public Invoice(String company, String invoice_number, BigDecimal unit_price, BigDecimal quantity) {
this.company = company;
this.invoice_number = invoice_number;
this.unit_price = unit_price;
this.quantity = quantity;
}
public BigDecimal total() {
return unit_price.multiply(quantity);
}
public void setUnit_price(BigDecimal unit_price) {
this.unit_price = unit_price;
}
public void setQuantity(BigDecimal quantity) {
this.quantity = quantity;
}
public void setInvoice_number(String invoice_number) {
this.invoice_number = invoice_number;
}
public void setCompany(String company) {
this.company = company;
}
public BigDecimal getUnit_price() {
return unit_price;
}
public BigDecimal getQuantity() {
return quantity;
}
public String getInvoice_number() {
return invoice_number;
}
public String getCompany() {
return company;
}
}
Invoice::total
বনাম জন্য +1invoice -> invoice.total()
।