在 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;
}
我有两种方法都可以从 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;
}