Рассмотрим следующий класс:

public class PersonalExpense {
    private String name;
    private int currentExpenses;

    ...

Как написать «конвейер» потока Java, который работает так же, как и первый метод (getRemainingCompanyBalance). этот код приводит к ошибке.

список содержит отдельные списки для каждого отдела. каждая запись в подсписке является экземпляром класса. имя / стоимость:

де # 1first " / 9900 , де # 1second " / 8700 , де # 2first " / 8500 , де # 2second " / 10000 , де # 3first " / 7800 , де # 3second " / 6900

    private static long getRemainingCompanyBalance ( long initialBalance, List<ArrayList<PersonalExpense>> total) {
        long remainingBalance = initialBalance;
        for (List<PersonalExpense> departmentExpense : total) {
            for (PersonalExpense personalExpense : departmentExpense) {
                System.out.println(personalExpense.getName());
                remainingBalance = remainingBalance - personalExpense.getCurrentExpenses();
            }
        }
        return remainingBalance;
    }

    public static long getRemainingCompanyBalanceLambda ( long initialBalance, List<ArrayList<PersonalExpense>> total) {
        long remainingBalance = initialBalance;


        Integer sum = total
        .stream()
        .flatMap(Collection::stream)
        .filter(pe -> pe instanceof PersonalExpense)
        .map (pe -> (PersonalExpense) pe)
        .collect(Collectors.toList())
        .mapToInt(PersonalExpense::getCurrentExpenses)
        .sum();


        return remainingBalance -= sum;
    }

}

Я пытаюсь собрать расходы, а затем вычесть их из баланса

0
Ahmad Abdullah 25 Сен 2018 в 16:16

2 ответа

Лучший ответ
public static long getRemainingCompanyBalanceLambda ( long initialBalance, List<ArrayList<PersonalExpense>> total) {

   int sum = total.stream()
        .flatMap(List::stream)
        .mapToInt(PersonalExpense::getCurrentExpenses)
        .sum();

   return initialBalance - sum;

}
1
Eugene 25 Сен 2018 в 13:40

У вас есть ненужные вызовы методов. Вам не нужно фильтровать Stream, поскольку он уже содержит только PersonalExpense экземпляры, и вам не следует собирать его в List, потому что это помешает вам сопоставить его с IntStream и вычисляя сумму.

public static long getRemainingCompanyBalanceLambda ( long initialBalance, List<ArrayList<PersonalExpense>> total) {
    return initialBalance - total
    .stream()
    .flatMap(Collection::stream)
    .mapToInt(PersonalExpense::getCurrentExpenses)
    .sum();
}
0
Eran 25 Сен 2018 в 13:39