我有两个用户的数组列表,我需要通过用用户的电子邮件地址搜索来查找用户。这是我的代码。它可以工作,但是可以更高效地完成吗?
public String getUserId(ArrayList<User> newUsers, ArrayList<User> oldUsers, String email) {
String userId = null;
for (User user1 : newUsers) {
if (user1.email.equals(email)) {
userId = user1.uid;
}
}
if(userId == null){
for (User user2 : oldUsers) {
if (user2.email.equals(email)) {
userId = user2.uid;
}
}
}
return userId;
}
这是User类。
public class User {
public String uid;
public String email;
public String name;
public String phoneNumber;
public User() {
}
}
答案 0 :(得分:1)
找到匹配项后,您需要通过break
终止循环:
public String getUserId(ArrayList<User> newUsers, ArrayList<User> oldUsers, String email) {
String userId = null;
for (User user1 : newUsers) {
if (user1.email.equals(email)) {
userId = user1.uid;
break;
}
}
if(userId == null){
for (User user2 : oldUsers) {
if (user2.email.equals(email)) {
userId = user2.uid;
break;
}
}
}
return userId;
}
答案 1 :(得分:0)
Java 8的Stream API与C#中的Linq类似
您可以执行以下操作:
User foundUser = newUsers.stream()
.filter((user) -> user.email == email)
.findFirst()
if(foundUser == null){
foundUser = oldUsers.stream()
.filter((user) -> user.email == email)
.findFirst()
}
return foundUser.uid;
基本上它的作用相同,但是更简捷一些,更整洁/更容易阅读。
如果您想继续使用for循环,请添加一个中断,以便在找到匹配项时退出for循环
答案 2 :(得分:0)
您可以将两个列表合并为一个列表,然后仅搜索该列表而不是遍历两个列表。
public String getUserId(ArrayList<User> newUsers, ArrayList<User> oldUsers, String email) {
// create a new list
List<User> consolidatedList = new ArrayList<>();
// add both lists to it
consolidatedList.addAll(newUsers);
consolidatedList.addAll(oldUsers);
// now just iterate over it
User findAnyUser = consolidatedList.stream().filter(e -> e.getEmail().equals(email))
.findFirst().orElse(null);
return findAnyUser != null ? findAnyUser.getUid() : "Not Found";
}
一旦找到 first 匹配项,列表的迭代就会停止,并返回相应的User
对象。现在,我们检查findAnyUser
是否为空,并根据它返回适当的uid
。
答案 3 :(得分:0)
使用Java 8流API和Lambda:
bar
答案 4 :(得分:0)
单行解决方案(java 8 +):
return Stream
.of(newUsers, oldUsers)
.flatMap(Collection::stream)
.filter(u -> Objects.equals(email, u.email))
.findFirst()
.orElse(new User()).email;
但是当您找不到用户时,它会强制您实例化用户。
答案 5 :(得分:0)
这是最干净的方式:
public int findRapperIndexInPairings(User user){
int index1 = getPairing1().indexOf(user);
int index2 = getPairing2().indexOf(user);
int userIndex = -1;
if(index1 > 1) userIndex = index1;
if(index2 > 1) userIndex = index2;
return userIndex;
}