собирая сумму поля в потоке Java - PullRequest
0 голосов
/ 25 сентября 2018

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

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

    ...

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

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

de # 1first "/ 9900, de # 1second" / 8700, de # 2first "/ 8500, de # 2second" / 10000, de # 3first "/ 7800, de #3 секунды "/ 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;
    }

}

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

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018
public static long getRemainingCompanyBalanceLambda ( long initialBalance, List<ArrayList<PersonalExpense>> total) {

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

   return initialBalance - sum;

}
0 голосов
/ 25 сентября 2018

Вы получили несколько ненужных вызовов методов.Вам не нужно фильтровать 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();
}
...