Stream方式获取第一个元素匹配的索引boolean

我有一个List 。 我想用特定的用户名获取流中(第一个)用户的索引。 我不希望实际上要求User.equals()为一些描述User ,只是为了拥有相同的用户名。

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

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

这不是我写过的最糟糕的代码,但它并不好。 它也不是那么灵活,因为它依赖于一个带有.equals()函数的类型的映射函数来描述你正在寻找的属性; 我宁愿有一些可以用于任意Function

谁知道怎么样?

偶尔在java中没有zipWithIndex 。 所以我遇到了类似的东西:

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

或者,您可以使用protonpack库中的zipWithIndex

注意

如果users.get不是恒定时间操作,那么该解决方案可能是耗时的。

试试这个:

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

您可以尝试Tagir Valeev制作的StreamEx库。 该库有一个方便的#indexOf方法。

这是一个简单的例子:

 List 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);