2017-11-16 29 views
5

Tôi có một cái gì đó như thế này:Luồng Java. Tổng hợp hai lĩnh vực trong một dòng của các đối tượng

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

Làm thế nào tôi có thể viết rằng trong một dòng? để thu thập f.e. Pair<Integer, Integer> với totalIncometotalOutcome?

EDITED:

Thank you guys để bình luận, câu trả lời của bạn, và involvment. Tôi sẽ có một câu hỏi về cách tiếp cận khác nhau cho vấn đề đó bằng cách sử dụng các luồng. Bạn nghĩ gì về điều đó:

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

Ý của bạn là 'trở lại mới Pair <> (totalIncome, totalOutcome); '? –

+0

Có, nhưng tôi nghĩ luồng gọi hai lần không hiệu quả (lần đầu tiên là 'thu nhập' và lần thứ hai cho 'kết quả'). Và tôi đã tự hỏi liệu tôi có thể tham gia cùng họ để cuối cùng chỉ nhận được một luồng trả lại tổng thu nhập và tổng của 'kết quả'? – user3529850

+0

Nếu bạn muốn bạn lặp lại một lần sử dụng cho vòng lặp và tăng hai khoản tiền dựa trên hai trường. – Pshemo

Trả lời

2

Không đo chính xác - mọi thứ đều đoán. Lập luận duy nhất tôi đồng ý là về khả năng đọc - điều này hầu như không xảy ra ở đây; nhưng trong trường hợp bạn muốn biết điều này cho các mục đích học tập, bạn có thể làm điều đó:

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

Giảm phải là trạng thái vô quốc tịch. Bạn có lẽ nên sử dụng 'collect()' thay vào đó, với một 'bộ tích lũy' và' bộ kết hợp' giống hệt nhau. – shmosel

+0

@shmosel đúng ... quá nhiều mã hóa ngày hôm nay. thx – Eugene

+0

Bạn không cần một 'Bộ sưu tập' trừ khi bạn vượt qua các đặc tính hoặc một người hoàn thiện. Chỉ cần gọi ['collect (supplier, accumulator, 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

Các vấn đề liên quan