我看到建议可以使用some
代替(first (filter
,但我对它们的工作方式存在差异感到困惑。任何人都可以解释为什么这不会产生相同的结果吗?
(some (comp #{:fu} :id) [{:id :fu :baz :bar}])
> :fu
(first (filter (comp #{:fu} :id) [{:id :fu :baz :bar}]))
> {:id :fu, :baz :bar}
是否还有其他惯用且不那么冗长的方法(first (filter
,即获得满足谓词的第一项?
答案 0 :(得分:4)
这两种用法在语义上不相同;每个都有自己独特的用例。
(some (comp #{:fu} :id) [{:id :fu :baz :bar}])
> :fu
根据the documented behavior of some
(first (filter (comp #{:fu} :id) [{:id :fu :baz :bar}]))
> {:id :fu, :baz :bar}
当且仅当它通过过滤器时,这将返回在过滤之前存在的项目。这是真的,因为filter
uses its function argument only to determine whether an item should be included in its output stream;除了排除过滤函数拒绝的项目之外,它不会以任何方式改变项目。