在 java 中发送表达式

Send expression in java

我有两种方法都可以从 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语句不同,如何减少代码重复? 例如,是否可以在参数中发送 expression/dynamic 布尔值?

您可以创建一个接受谓词和 return 第一个匹配元素的通用方法:

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));
}

您可以使用 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方法

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

public User getUserByName(String name) { return getUser(u -> u.getUsername().equals(name)); }

感谢两位的回答。这就是我让它工作的方式。

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;
}