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