Stream Way to get index of first element matching boolean

前端 未结 6 1036
隐瞒了意图╮
隐瞒了意图╮ 2020-12-01 09:12

I have a List. I want to get the index of the (first) user in the stream with a particular username. I don\'t want to actually require the Us

相关标签:
6条回答
  • 2020-12-01 09:28

    Try This:

    IntStream.range(0, users.size())
        .filter(userInd-> users.get(userInd).getName().equals(username))
        .findFirst()
        .getAsInt();
    
    0 讨论(0)
  • 2020-12-01 09:30

    There is the detectIndex method in the Eclipse Collections library which takes a Predicate.

    int index = ListIterate.detectIndex(users, user -> username.equals(user.getName()));
    

    If you have a method on User class which returns boolean if username matches you can use the following:

    int index = ListIterate.detectIndexWith(users, User::named, username);
    

    Note: I a committer for Eclipse Collections

    0 讨论(0)
  • 2020-12-01 09:33

    You can try StreamEx library made by Tagir Valeev. That library has a convenient #indexOf method.

    This is a simple example:

    List<User> users = asList(new User("Vas"), new User("Innokenty"), new User("WAT"));
    long index = StreamEx.of(users)
            .indexOf(user -> user.name.equals("Innokenty"))
            .getAsLong();
    System.out.println(index);
    
    0 讨论(0)
  • 2020-12-01 09:37

    Occasionally there is no pythonic zipWithIndex in java. So I came across something like that:

    OptionalInt indexOpt = IntStream.range(0, users.size())
         .filter(i -> searchName.equals(users.get(i)))
         .findFirst();
    

    Alternatively you can use zipWithIndex from protonpack library

    Note

    That solution may be time-consuming if users.get is not constant time operation.

    0 讨论(0)
  • 2020-12-01 09:37

    A solution without any external library

    AtomicInteger i = new AtomicInteger(); // any mutable integer wrapper
    int index = users.stream()
        .peek(v -> i.incrementAndGet())
        .anyMatch(user -> user.getName().equals(username)) ? // your predicate
        i.get() - 1 : -1;
    

    peek increment index i while predicate is false hence when predicate is true i is 1 more than matched predicate => i.get() -1

    0 讨论(0)
  • 2020-12-01 09:43

    Using Guava library: int index = Iterables.indexOf(users, u -> searchName.equals(u.getName()))

    0 讨论(0)
提交回复
热议问题