2017-11-16 28 views
5

की एक धारा में दो क्षेत्रों योग मैं कुछ इस तरह है:जावा स्ट्रीम। वस्तुओं

Integer totalIncome = carDealer.getBrands().stream().mapToInt(brand -> brand.getManufacturer().getIncome()).sum(); 
Integer totalOutcome = carDealer.getBrands().stream().mapToInt(brand -> brand.getManufacturer().getOutcome()).sum(); 

कैसे मुझे लगता है कि में एक धारा लिख ​​सकता है? एफई इकट्ठा करने के लिए Pair<Integer, Integer>totalIncome और totalOutcome के साथ?

संपादित:

आप अपनी टिप्पणी, उत्तर, और भागीदारी के लिए लोगों को धन्यवाद। धाराओं का उपयोग कर उस समस्या के विभिन्न दृष्टिकोण के बारे में मुझे एक प्रश्न होगा। आप इसके बारे में क्या सोचते हैं:

final IncomeAndOutcome incomeAndOutcome = carDealer.getBrands() 
        .stream() 
        .map(Brand::getManufacturer) 
        .map(IncomeAndOutcome::of) 
        .reduce(IncomeAndOutcome.ZERO, IncomeAndOutcome::sum); 

static class IncomeAndOutcome { 

    private static final IncomeAndOutcome ZERO = of(0, 0); 

    @Getter 
    private final int income; 

    @Getter 
    private final int outcome; 

    public static IncomeAndOutcome of(final int income, final int outcome) { 
     return new IncomeAndOutcome(income, outcome); 
    } 

    public static IncomeAndOutcome of(final Manufacturer manufacturer) { 
     return new IncomeAndOutcome(manufacturer.getIncome(), manufacturer.getOutcome()); 
    } 

    IncomeAndOutcome(final int income, final int outcome) { 
     this.income = income; 
     this.outcome = outcome; 
    } 

    IncomeAndOutcome sum(final IncomeAndOutcome incomeAndOutcome) { 
     return of(this.income + incomeAndOutcome.getIncome(), this.outcome + incomeAndOutcome.getOutcome()); 
    } 
} 
+0

आप' लौट नई जोड़ी <> (totalIncome, totalOutcome) आपका मतलब है: लेकिन मामले में आप यह कर सकते हैं, शैक्षिक प्रयोजनों के लिए इस जानना चाहता था तुम? –

+0

हां, लेकिन मुझे लगता है कि दो बार कॉलिंग स्ट्रीम कुशल नहीं है (पहली बार 'आय' और 'परिणाम' के लिए दूसरी बार)। और मैं सोच रहा था कि क्या मैं उनसे जुड़ सकता हूं, अंततः केवल एक धारा प्राप्त करने के लिए जो 'आय' और 'परिणाम' के योग को वापस लाती है? – user3529850

+0

यदि आप चाहते हैं कि आप एक बार लूप के लिए उपयोग करें और दो फ़ील्ड के आधार पर दो रकम बढ़ाएं। – Pshemo

उत्तर

2

सही ढंग से मापने के बिना - सबकुछ अनुमान लगा रहा है। एकमात्र तर्क जो मैं सहमत हूं वह पठनीयता के बारे में है - यह शायद ही मामला है; ; `

int[] result = carDealer.getBrands() 
     .stream() 
     .map(brand -> new int[]{brand.getManufacturer().getIncome(), 
           brand.getManufacturer().getOutcome()}) 
     .collect(Collector.of(
        () -> new int[2], 
        (left, right) -> { 
         left[0] += right[0]; 
         left[1] += right[1]; 
        }, 
        (left, right) -> { 
         left[0] += right[0]; 
         left[1] += right[1]; 
         return left; 
        })); 
+2

कमी होना स्टेटलेस होना चाहिए। आपको संभवत: 'एकत्रित') और 'संयोजक' के साथ 'संग्रह() 'का उपयोग करना चाहिए। – shmosel

+0

@ श्मोसेल सही ... आज बहुत ज्यादा कोडिंग। thx – Eugene

+0

जब तक आप विशेषताओं या फिनिशर पास नहीं कर लेते हैं, तब तक आपको 'कलेक्टर' की आवश्यकता नहीं होती है। बस कॉल करें ['संग्रह (आपूर्तिकर्ता, संचयक, combiner)'] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#collect-java.util.function .Supplier-java.util.function.BiConsumer-java.util.function.BiConsumer-)। – shmosel

संबंधित मुद्दे