В Java8
Когда я пишу такой код:
Stream<Integer> xs = Arrays.asList(1, 3, 5, 6, 7, 10).stream();
xs.map(x -> x * x).filter (x -> x > 15).forEach(System.out::println);
потоки Java8 разделены на два раздела; промежуточные или терминальные операции, где фактическое действие -AFAIK (итерации под капотом) выполняется в операциях терминала, в то время как каждый промежуточный ops добавляет свое собственное имя - я назову его - Применить внутренние классы.
Таким образом, в списке будет только одна итерация.
Пример кода из JDK8:
@Override
@SuppressWarnings("unchecked")
public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper) {
Objects.requireNonNull(mapper);
return new StatelessOp<P_OUT, R>(this, StreamShape.REFERENCE,
StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
@Override
Sink<P_OUT> opWrapSink(int flags, Sink<R> sink) {
return new Sink.ChainedReference<P_OUT, R>(sink) {
@Override
public void accept(P_OUT u) {
downstream.accept(mapper.apply(u));
}
};
}
};
}
В Scala
Когда я пишу такой код:
val xs = List(1, 3, 5, 6, 7, 10)
xs map (x => x * x) filter (x => x > 15) foreach (println)
Я читал об этом некоторое время, но я никогда не слышал о таких терминах явно, кроме того, циклы реализации SDK (с использованием рекурсии или регулярных циклов) для каждой операции:
final override def map[B, That](f: A => B)(implicit bf: CanBuildFrom[List[A], B, That]): That = {
if (bf eq List.ReusableCBF) {
if (this eq Nil) Nil.asInstanceOf[That] else {
val h = new ::[B](f(head), Nil)
var t: ::[B] = h
var rest = tail
while (rest ne Nil) {
val nx = new ::(f(rest.head), Nil)
t.tl = nx
t = nx
rest = rest.tail
}
h.asInstanceOf[That]
}
}
else super.map(f)
}
Мои вопросы:
Можно ли считать, что реализация Java на одной и той же вещи будет намного быстрее. ( O (n) в Java
vs O (кратные n) в Scala
)