我想要一种惯用的方式来找到与谓词匹配的列表中的第一个元素。
当前代码非常丑陋:
[x for x in seq if predicate(x)][0]
我已经考虑过将其更改为:
from itertools import dropwhile
dropwhile(lambda x: not predicate(x), seq).next()
但是必须有一些更优雅的方法……如果返回一个None
值而不是没有找到匹配项引发异常,那将是一个很好的选择。
我知道我可以像这样定义一个函数:
def get_first(predicate, seq):
for i in seq:
if predicate(i): return i
return None
但是,如果已经有内置的插件开始用这样的实用函数填充代码,这是很鸡肋的(人们可能不会注意到它们已经在那里,因此随着时间的推移它们会不断重复出现)。
要查找seq
与匹配的序列中的第一个元素predicate
:
next(x for x in seq if predicate(x))
或(itertools.ifilter
在Python 2上):
next(filter(predicate, seq))
StopIteration
如果没有,它将引发。
None
如果没有这样的元素,则返回:
next((x for x in seq if predicate(x)), None)
要么:
next(filter(predicate, seq), None)
我刚刚开始玩Java 8 lambda,我正在尝试实现一些我在函数式语言中习惯的东西。 例如,大多数函数语言都有某种对序列进行操作的find函数,或返回第一个元素的列表,该元素的谓词为。我能看到的在《Java八号》中实现这一点的唯一方法是: 然而,这似乎没有效率,因为过滤器将扫描整个列表,至少在我的理解(这可能是错误的)。有更好的办法吗?
我陷入了java流操作的边缘案例... 我想对以下行为进行编码:“从一个任意的水果篮子中,收集20个最小的,除了最小的梨,因为我们不想那样。” 额外的奖励:来的篮子可能没有任何梨。 null 我不能使用本地布尔值并在筛选第一个pear后将其设置为,因为lambda中的所有局部变量都必须是final的。 最坏的情况是,我可以将篮子一分为二,梨和非梨,对梨进行排序,如果有的话,适当地将它们子列表。这看
使用Java8+,您可以轻松找到与匹配的集合的所有元素。
我有一个包含有4个参数(x,y,iD和myType)的对象的ArrayList。我想验证这个ArrayList中是否有具有特定坐标的对象,独立于它们的iD和myType参数。我想使用但当对象只有一个参数时。 以下是全部代码: 例如,如果我想验证是否有一个具有坐标(3.5,4.5)的对象,我应该如何继续?有没有简单的方法? 谢谢你的帮忙
以下是更详细的错误消息: 我将代码中的问题隔离在下面的某个地方,尽管我不知道抛出这个异常的具体原因: gradle.build-项目
我收集了< code > 我想找到“每种类型中的一种”,尽管我想找到产品集合中每个谓词的第一个匹配项。 目前我的代码如下: 但这当然会多次迭代产品集合,这是不需要的,因为在我的例子中,我有100000个产品和64个谓词,并且需要很长时间。 在我的特例中,谓词是互斥的:如果一个谓词返回true,那么对于该特定产品,所有其他谓词都可以跳过。因为我使用了< code>findFirst,所以对于所有其他