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

新手上路,请多包涵

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

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

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

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

任何人都知道如何?

原文由 Edward Peters 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 905
2 个回答

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

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

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

笔记

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

原文由 vsminkov 发布,翻译遵循 CC BY-SA 3.0 许可协议

尝试这个:

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

原文由 AmanSinghal 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题