获取第一个元素匹配布尔值的索引的流方式

2022-08-31 12:34:22

我有一个.我想获取流中具有特定用户名的(第一个)用户的索引。我不想真正要求对某些描述,只是为了具有相同的用户名。List<Users>User.equals()User

我可以想出一些丑陋的方法来做到这一点(迭代和计数),但感觉应该有一个很好的方法来做到这一点,可能是通过使用Streams。到目前为止,我拥有的最好的是:

int index = users.stream()
    .map(user -> user.getName())
    .collect(Collectors.toList())
    .indexOf(username);

这不是我写过的最糟糕的代码,但它不是很好。它也不是那么灵活,因为它依赖于一个映射到一个类型,该类型具有描述您要查找的属性的函数;我宁愿有一些可以任意工作的东西.equals()Function<T, Boolean>

有人知道怎么做吗?


答案 1

有时在java中没有pythonic。所以我遇到了这样的事情:zipWithIndex

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

或者,您可以使用质子包zipWithIndex

注意

如果 users.get 不是常数时间操作,则该解决方案可能非常耗时。


答案 2

试试这个:

IntStream.range(0, users.size())
    .filter(userInd-> users.get(userInd).getName().equals(username))
    .findFirst()
    .getAsInt();

推荐