我有一个List<Users>
。我想获得流中具有特定用户名的(第一个)用户的索引。我不想实际上要求User
是.equals()
到一些描述的User
,只是为了具有相同的用户名。
我可以想出一些丑陋的方法(迭代和计数),但我觉得应该有一个很好的方法来做这件事,可能是通过使用流。
int index = users.stream()
.map(user -> user.getName())
.collect(Collectors.toList())
.indexOf(username);
这不是我写过的最差的代码,但也不是很好,而且也不是很灵活,因为它依赖于一个Map函数,该函数通过.equals()
函数来描述你要寻找的属性;我更希望有一个可以对任意Function<T, Boolean>
工作的程序
有人知道怎么做吗?
7条答案
按热度按时间wwodge7n1#
在java中偶尔也会出现pythonic
zipWithIndex
,所以我遇到了类似的情况:或者,您可以使用protonpack库中的
zipWithIndex
附注
62o28rlo2#
试试这个:
toe950273#
使用Guava库:
int index = Iterables.indexOf(users, u -> searchName.equals(u.getName()))
zzlelutf4#
你可以试试Tagir Valeev制作的StreamEx库,这个库有一个方便的#indexOf方法。
这是一个简单的例子:
bvjveswy5#
没有任何外部库的解决方案
predicate 为假时peek递增索引i因此 predicate 为真时i比匹配 predicate 大1 =〉
i.get() -1
8cdiaqws6#
Eclipse Collections库中有一个
detectIndex
方法,它接受一个Predicate
。如果
User
类上有一个方法,在username
匹配时返回boolean
,则可以使用以下方法:注意:我是Eclipse集合的提交者
qc6wkl3g7#
1.确定元素是否存在。
1.如果存在,则返回索引,否则返回-1
从1开始,所以我们要得到index,所以我们要从index中减去1