Edw*_*ers 40 java java-8 java-stream
我有一个List<Users>.我想用特定的用户名获取流中(第一个)用户的索引.我不想竟要求User将.equals()一些描述User,只是为了有相同的用户名.
我可以想到这样做的丑陋方法(迭代和计数),但感觉应该有一个很好的方法来做到这一点,可能是通过使用Streams.到目前为止,我所拥有的最好的是:
int index = users.stream()
.map(user -> user.getName())
.collect(Collectors.toList())
.indexOf(username);
Run Code Online (Sandbox Code Playgroud)
这不是我写过的最糟糕的代码,但它并不好.它也不是那么灵活,因为它依赖于一个带有.equals()描述你正在寻找的属性的函数的类型的映射函数; 我宁愿有一些可以随心所欲的东西Function<T, Boolean>
谁知道怎么样?
vsm*_*kov 53
偶尔zipWithIndex在java中没有pythonic .所以我遇到了类似的东西:
OptionalInt indexOpt = IntStream.range(0, users.size())
.filter(i -> searchName.equals(users.get(i)))
.findFirst();
Run Code Online (Sandbox Code Playgroud)
或者您可以使用zipWithIndex从protonpack库
注意
如果users.get不是恒定时间操作,那么该解决方案可能是耗时的.
Ama*_*hal 11
试试这个:
IntStream.range(0, users.size())
.filter(userInd-> users.get(userInd).getName().equals(username))
.findFirst()
.get();
Run Code Online (Sandbox Code Playgroud)
kar*_*aze 10
使用番石榴库: int index =
Iterables.indexOf(users, u -> searchName.equals(u.getName()))
您可以尝试StreamEx所作库Tagir Valeev.该库有一个方便的#indexOf方法.
这是一个简单的例子:
List<User> 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);
Run Code Online (Sandbox Code Playgroud)
没有任何外部库的解决方案
AtomicInteger i = new AtomicInteger(); // any mutable integer wrapper
int index = users.stream()
.peek(v -> i.incrementAndGet())
.anyMatch(user -> user.getName().equals(username)) ? // your predicate
i.get() - 1 : -1;
Run Code Online (Sandbox Code Playgroud)
在谓词为假时查看增量索引 i 因此当谓词为真时,我比匹配的谓词多 1 => i.get() -1