javastream取index_关于java:Stream获取与布尔值匹配的第
⼀个元素的。。。
我有⼀个List。 我想获取具有特定⽤户名的流中(第⼀个)⽤户的索引。 我并不想实际上将User设置为某些描述的User的.equals(),只是具有相同的⽤户名。
我可以想到执⾏此操作的丑陋⽅法(重复和计数),但感觉应该有⼀种不错的⽅法(可能是通过使⽤Streams来执⾏此操作)。 到⽬前为⽌,我拥有的最好的是:
int index = users.stream()
.map(user -> Name())
.List())
java中index是什么意思.indexOf(username);
这不是我编写过的最糟糕的代码,但这不是很好。 它也不是那么灵活,因为它依赖于⼀个具有.equals()函数的类型的映射函数,该函数描述了您要查的属性。 我宁愿有⼀些可以对任意Function起作⽤的东西
有⼈知道吗?
为什么"迭代"很难看?
流和索引混合不好。 通常,您最好此时退回到旧式循环。
@Andreas我喜欢流的⼀件事是将与集合相关的逻辑与所要询问的特定事物分开。 在这种情况下,可能会问很多不同的问题,这些问题仅与核⼼Function不同,因此感觉应该有⼀种⽅法可以将其从常规收集逻辑中抽象出来。
是什么使您⽆法在for循环内的if语句中使⽤Function的? 当您拥有Predicate< T >时为什么要使⽤Function?
@Andreas因为那⾥是您⼿动描述所有与结构相关的代码,⽽不是将其分开。 对于另⼀个问题,我只是忘记了Predicate是⼀回事。
整洁的Java 11解决⽅案:int index = users.stream().map(User::getName).takeWhile(not(username::equals)).count();
有时Java中没有pythonic zipWithIndex。所以我遇到了这样的事情:
OptionalInt indexOpt = IntStream.range(0, users.size())
.filter(i -> searchName.(i)))
.findFirst();
或者,您可以使⽤来⾃protonpack库的zipWithIndex
注意
如果不是恒定时间操作,则该解决⽅案可能很耗时。
这样可⾏。我也可以通过仅在过滤操作中查具有给定索引的⽤户来跳过⼀对货币对……不确定这是好是坏。
@EdwardPeters绝对更好。⾄少可以消除额外的内存流量
@vsminkov,您在这⾥应该⼩⼼。没有⼈说该列表具有O(1)访问权限。
@SerCe⾜够公平。另⼀个选择是像protonpack⼀样实现⾃定义拆分器。⽣病了
尝试这个:
IntStream.range(0, users.size())
.filter(userInd-> (userInd).getName().equals(username))
.findFirst()
.get();
这让我成为⽤户,但没有索引
⾹港专业教育学院更新解决⽅案以到索引。
希望到⽤户,否则代码崩溃。
同意您的意见,能否请您在这⾥提供处理该⽤例的建议。
像其他索引操作⼀样,使⽤orElse(-1)代替get()。
但是代码将在此处(userInd)崩溃。如果返回的⽤户为null,则为getName()。流API是否也照顾NullPointerexception?
@AmanSinghal IMO,列表中不应包含空值,但空列表或缺少请求名称的列表是有意义的。如果由于某⼈将空值放⼊列表⽽获得NPE,那是他们的错
您可以尝试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);
没有任何外部库的解决⽅案
AtomicInteger i = new AtomicInteger(); // any mutable integer wrapper
int index = users.stream()
.peek(v -> i.incrementAndGet())
.anyMatch(user -> Name().equals(username)) ? // your predicate
<() - 1 : -1;
谓词为false时的peek增量索引i,因此当谓词为true时,我⽐匹配的谓词多1 => i.get() -1
Eclipse Collections库中有⼀个detectIndex⽅法,该⽅法采⽤Predicate。
int index = ListIterate.detectIndex(users, user -> username.Name()));
如果User类上有⼀个⽅法,如果username匹配,则该⽅法返回boolean,则可以使⽤以下⽅法:
int index = ListIterate.detectIndexWith(users, User::named, username);
注意:我是Eclipse Collections的提交者
使⽤Guava库:int index =
Iterables.indexOf(users, u -> searchName.Name()))
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论