Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的Send表达式_Java_Code Duplication - Fatal编程技术网

java中的Send表达式

java中的Send表达式,java,code-duplication,Java,Code Duplication,我有两个方法都可以从Arraylist获取用户对象 public User getUser(int userID) { ListIterator<User> listIterator = listOfLoggedInUsers.listIterator(); User user; while(listIterator.hasNext()) { user = listIterator.next(); if (user.getID(

我有两个方法都可以从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;
}
public用户getUser(int-userID){
ListIterator ListIterator=listOfLoggedInUsers.ListIterator();
用户;
while(listIterator.hasNext()){
user=listIterator.next();
if(user.getID()==userID){
返回用户;
}
}
返回null;
}
公共用户getUser(字符串用户名){
ListIterator ListIterator=listOfLoggedInUsers.ListIterator();
用户;
while(listIterator.hasNext()){
user=listIterator.next();
if(user.getUsername().equals(username)){
返回用户;
}
}
返回null;
}
由于这些方法仅在if语句中有所不同,如何减少代码重复?
例如,是否可以在参数中发送表达式/动态布尔值?

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

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));
}
private User getUser(谓词){
返回ListofLogedinUsers.stream()的列表
.filter(谓词)
.findFirst()
.orElse(空);
}
公共用户getUser(int userID){
返回getUser(user->user.getID()==userID);
}
公共用户getUser(字符串用户名){
返回getUser(user->user.getUsername().equals(username));
}

您可以使用

<> P>为了使这更好和更可读,您可以考虑制作<代码> GETUSER < /COD>

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(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;
}
public用户getUserByID(int-userID){
返回getUser(user->user.getID()==userID);
}
公共用户getUserByUsername(字符串用户名){
返回getUser(user->user.getUsername().equals(username));
}
私有用户getUser(谓词){
ListIterator ListIterator=listOfLoggedInUsers.ListIterator();
用户;
while(listIterator.hasNext()){
user=listIterator.next();
if(谓词测试(用户)){
返回用户;
}
}
返回null;
}

我有点希望您不要用面向内部的方法重载
getUser
方法……否则我也会这么做。我还会将私有getUser重命名为getUser0或其他名称(例如,findUser(谓词)和findUserById(),findUserByName())。如果您使用的是
谓词
,为什么还要使用迭代器?@Makoto问题是我们是否可以将这两种方法合并为一种方法,添加任何其他方法都是一种额外的好处。永不停息,如果它能让事情变得更好的话。
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)); }
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;
}