如何从java中的类对象列表中获取第一个匹配元素的索引(不需要使用任何第三方库)。

问题描述 投票:0回答:2

我有一个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 list class collections indexof
2个回答
1
投票

你可以使用Java流和选项来实现这个功能

Optional<User>firstMatchingUserOptional = userList.stream.filter(user -> user.getUserStatus().equals(UserStatus.AVAILABLE)).findFirst();

if(firstMatchingUserOptional.isPresent())
    int firstMatchingUserIndex = userList.indexOf(firstMatchingUserOptional.get());

1
投票

只要在列表中迭代,当你找到了 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;
}

1
投票

你可以使用

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. 你不需要自己实现这样的逻辑。


0
投票

你可以使用for循环。

类似于

`for(User tempUser : userList){
 if(tempUser.UserStatus.equals(UserStatusTemp)){
 //do job
 break;
  }
  }`
© www.soinside.com 2019 - 2024. All rights reserved.