Отправить выражение в Java - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть два метода, которые оба получают пользовательский объект от Arraylist.

public User getUser(int userID) {
    ListIterator<User> listIterator = listOfLoggedInUsers.listIterator();
    User user;
    while(listIterator.hasNext()) {
        user = listIterator.next();
        if (user.getID() == userID) {
            return user;
        }
    }
    return null;
}

public User getUser(String username) {
    ListIterator<User> listIterator = listOfLoggedInUsers.listIterator();
    User user;
    while(listIterator.hasNext()) {
        user = listIterator.next();
        if (user.getUsername().equals(username)) {
            return user;
        }
    }
    return null;
}

Поскольку методы различаются только в условии if, как можно уменьшить дублирование кода?Можно ли отправить выражение / динамическое логическое значение в аргументах, например?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Вы можете объединить их обоих следующим образом с помощью Predicate<User>

public User getUser(Predicate<User> predicate){
       for (User u : listOfLoggedInUsers)
           if (predicate.test(u)) return u;
       return null;
}

, затем вызвать его как:

getUser(u -> u.getUserId() == userID)
getUser(u -> u.getUsername().equals(username))
...
...

Чтобы сделать этолучше и удобочитаемее вы можете сделать getUser

private User getUser(Predicate<User> predicate){
        for (User u : listOfLoggedInUsers)
           if (predicate.test(u)) return u;
        return null;
}

, а затем выставить два открытых метода

public User getUserById(int userID) { return getUser(u -> u.getUserId() == userID); }

public User getUserByName(String name) { return getUser(u -> u.getUsername().equals(name)); }
0 голосов
/ 04 декабря 2018

Благодаря обоим ответам.Вот как я заставил это работать.

public User getUserByID(int userID) {
    return getUser(user -> user.getID() == userID);
}

public User getUserByUsername(String username) {
    return getUser(user -> user.getUsername().equals(username));
}

private User getUser(Predicate<User> predicate) {
    ListIterator<User> listIterator = listOfLoggedInUsers.listIterator();
    User user;
    while(listIterator.hasNext()) {
        user = listIterator.next();
        if (predicate.test(user)) {
            return user;
        }
    }
    return null;
}
0 голосов
/ 04 декабря 2018

Вы можете создать общий метод, который принимает предикат и возвращает первый соответствующий элемент:

private User getUser(Predicate<User> predicate) {
    return listOfLoggedInUsers.stream()
            .filter(predicate)
            .findFirst()
            .orElse(null);
}

public User getUser(int userID) {
    return getUser(user -> user.getID() == userID);
}

public User getUser(String username) {
    return getUser(user -> user.getUsername().equals(username));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...