从源代码来看:
clojure.lang.Cons(严格的列表元素,clojure.lang.PersistentList非常相似),https://github.com/clojure/clojure/blob/1.2.0/src/jvm/clojure/lang/Cons.java#L34
public Object first(){
return _first;
}
Run Code Online (Sandbox Code Playgroud)
clojure.lang.LazySeq(惰性序列元素),https://github.com/clojure/clojure/blob/1.2.0/src/jvm/clojure/lang/LazySeq.java#L77
public Object first(){
seq();
if(s == null)
return null;
return s.first();
}
Run Code Online (Sandbox Code Playgroud)
在哪里
final synchronized Object sval(){
if(fn != null)
{
try
{
sv = fn.invoke();
fn = null;
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
if(sv != null)
return sv;
return s;
}
final synchronized public ISeq seq(){
sval();
if(sv != null)
{
Object ls = sv;
sv = null;
while(ls instanceof LazySeq)
{
ls = ((LazySeq)ls).sval();
}
s = RT.seq(ls);
}
return s;
}
Run Code Online (Sandbox Code Playgroud)
所以你肯定是要付出代价的。这在很大程度上取决于每个特定的用例,该价格对您的影响有多大,以及它是否被延迟评估为您节省的内存和减少浪费的计算所抵消。