我有一个List类对象(List)。我想从列表中获取第一个具有特定用户状态的用户的索引。
public enum UserStatus {
CREATED("CREATED"),
AVAILABLE("AVAILABLE"),
CHECKIN("CHECKIN"),
CHECKOUT("CHECKOUT"),
ON_TRIP("ONTRIP"),
UNAVAILABLE("UNAVAILABLE");
}
Class Users{
private Long id;
private Long userId;
private UserStatus userStatus;
private Date createdAt;
}
Class Main{
public static void main(String args[]){
List<Users> userList = getListofUser(); // this method will give me list of users
// here I want to find the first user whose status is AVAILABLE
}
}
我正在寻找类似于List indexOf()的方法。
你可以使用Java流和选项来实现这个功能
Optional<User>firstMatchingUserOptional = userList.stream.filter(user -> user.getUserStatus().equals(UserStatus.AVAILABLE)).findFirst();
if(firstMatchingUserOptional.isPresent())
int firstMatchingUserIndex = userList.indexOf(firstMatchingUserOptional.get());
只要在列表中迭代,当你找到了 AVAILABLE
从循环中返回。
Users getFirstAvailableUser(List<Users> userList ) {
Iterator<Users> it = userList.iterator();
while ( it.hasNext() ) {
Users curr = it.next();
if ( curr.getUserStatus() == UserStatus.AVAILABLE ) {
return curr;
}
}
return null;
}
你可以使用
int index = IntStream.range(0, userList.size())
.filter(ix -> userList.get(ix).getUserStatus() == UserStatus.AVAILABLE)
.findFirst().orElse(-1);
如果你不想使用Stream API或怀疑列表没有有效的随机访问,你可以使用
int index = -1;
for(ListIterator<Users> i = userList.listIterator(); i.hasNext(); ) {
if(i.next().getUserStatus() == UserStatus.AVAILABLE) {
index = i.previousIndex();
break;
}
}
作为一个补充说明,类名应该反映出该类的单个实例所代表的内容,即 User
而不是 Users
当一个对象代表一个用户时。此外,不需要将对象的名称传递给 enum
常量给自己。它们已经知道自己的名字。
当你把类型声明为
public enum UserStatus {
CREATED,
AVAILABLE,
CHECKIN,
CHECKOUT,
ON_TRIP,
UNAVAILABLE
}
呼叫 UserStatus.AVAILABLE.name()
会给你字符串 "AVAILABLE"
并称 UserStatus.valueOf("AVAILABLE")
将返回常数 UserStatus.AVAILABLE
. 你不需要自己实现这样的逻辑。
你可以使用for循环。
类似于
`for(User tempUser : userList){
if(tempUser.UserStatus.equals(UserStatusTemp)){
//do job
break;
}
}`