java中的Send表达式
我有两个方法都可以从Arraylist获取用户对象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(
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;
}