Utknąłem w tej metodzie, ponieważ warunek if else mówi, że Warunek użytkownicyWSprzedaży && UżytkownicyWPłatności jest zawsze false Warunek użytkownicyWSprzedaży && UżytkownicyWpożyczkach jest zawsze false ...

0
Angge 26 czerwiec 2021, 16:18

4 odpowiedzi

Najlepsza odpowiedź

Masz dwa rozwiązania.

  1. Zmień kolejność warunków, jak pokazali inni. W swoim kodzie do czasu trafienia && stwierdzeń, z którymi miałeś do czynienia już z przypadkami, gdy połowa jest prawdziwa. && (dwie klauzule) jest bardziej restrykcyjny niż pojedyncza klauzula.

  2. Ewentualnie wstaw podwójne klauzule wewnątrz poprzednich ifs.

     if (usersInSales) {
         return getUsersInSales(users);
     } else if (usersInPayments) {
         return getUsersInPayments(users);
     } else if (usersInLoans) {
         return getUsersInLoans(users);
     } else if (usersInSales && usersInPayments) {
         return Stream.concat(getUsersInSales(users).stream(), getUsersInPayments(users).stream()).distinct().collect(Collectors.toList());
     } else if (usersInSales && usersInLoans) {...
    

Staje się

    if (usersInSales) {
        if (usersInPayments) { // Nested if is like && operator.
            return Stream.concat(getUsersInSales(users).stream(), getUsersInPayments(users).stream()).distinct().collect(Collectors.toList());
        } else {
            return getUsersInSales(users);
        }
    } else if (usersInPayments) { ...

To jest trochę bardziej wydajne i myślę, że ogólnie jest to lepsze.

3
Alan 26 czerwiec 2021, 13:44
if (usersInSales) {
        return getUsersInSales(users);
    } else if (usersInPayments) {    ---> You get here when userInSales = false
        return getUsersInPayments(users);
    } else if (usersInLoans) {  --> You get here when usersInSales = false && usersInPayments = false
        return getUsersInLoans(users);
    }  else if () {  --> You get here when usersInSales = false && usersInPayments = false && usersInLoans = false. No use in comparing what you compare here. It will be always false as it reports to
     }

Mam nadzieję, że teraz możesz znaleźć wyjście way

Możesz spróbować najpierw sprawdzić najbardziej szczegółowe ograniczenia, a następnie przejść do bardziej ogólnych ograniczeń.

if (usersInSales && usersInPayments) {
        return Stream.concat(getUsersInSales(users).stream(), getUsersInPayments(users).stream()).distinct().collect(Collectors.toList());
    } else if (usersInSales && usersInLoans) {
        return Stream.concat(getUsersInSales(users).stream(), getUsersInLoans(users).stream()).distinct().collect(Collectors.toList());
    } else if (usersInPayments && usersInLoans) {
        return Stream.concat(getUsersInPayments(users).stream(), getUsersInLoans(users).stream()).distinct().collect(Collectors.toList());
    } else if (usersInSales) {
        return getUsersInSales(users);
    } else if (usersInPayments) {
        return getUsersInPayments(users);
    } else if (usersInLoans) {
        return getUsersInLoans(users);
    } else return users;

Sprawdzanie przepływu pracy, jednak IMO twoja metoda miałaby więcej sensu bez wszystkich tych sprawdzeń. Tylko to może wystarczyć

 private List<UserResource> usersFilteredByDepartment(List<UserResource> users, boolean usersInSales, boolean usersInPayments, boolean usersInLoans) {
    
     return Stream.concat(
usersInPayments? getUsersInPayments(users).stream(): Stream.empty(),
usersInLoans? getUsersInLoans(users).stream(): Stream.empty(), 
usersInSales? getUsersInSales(users).stream(): Stream.empty()
).distinct().collect(Collectors.toList());
    
}
3
Boug 26 czerwiec 2021, 13:47

Twoje ostatnie 3 warunki nigdy nie zadziałają. ponieważ jeden z pierwszych 3 warunków będzie już spełniony. Aby to naprawić, musisz odwrócić kolejność warunków, spróbuj tego:

if (usersInSales && usersInPayments) {
    } else if (usersInSales && usersInLoans) {
    } else if (usersInPayments && usersInLoans) {
    } else if (usersInSales ) {
    } else if ( usersInLoans) {
    } else if (usersInLoans) {
    } else return users;
1
Hamza 26 czerwiec 2021, 13:25

Rozważ swoją logikę: najpierw sprawdzasz usersInSales i zwracasz, jeśli to prawda. Następnie sprawdzasz usersInPayments i zwracasz, jeśli to prawda. Więc kiedy następnie sprawdzisz usersInSales && usersInPayments, oba będą fałszywe, ponieważ obsłużyłeś już przypadki, w których którykolwiek z nich jest prawdziwy.

Musisz zmienić swoją logikę, aby obsługiwać dodatek warunków, a nie wyłącznie.

1
Mark Rotteveel 26 czerwiec 2021, 13:24