Trong Java8
Khi tôi viết mã như:Scala có các lệnh trung gian/thiết bị đầu cuối như Java8 không?
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);
suối Java8 được chia thành hai phần; các phép toán trung gian và đầu cuối, trong đó -AFAIK - hành động thực tế (các phép lặp theo dõi) được thực hiện trong các ops đầu cuối, trong khi mỗi op trung gian gắn thêm tên riêng của nó - Áp dụng các lớp bên trong.
Bằng cách này, sẽ chỉ có một lần lặp trong danh sách.
Mẫu mã từ 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));
}
};
}
};
}
Trong Scala
Khi tôi viết mã như:
val xs = List(1, 3, 5, 6, 7, 10)
xs map (x => x * x) filter (x => x > 15) foreach (println)
Tôi đã được một thời gian đọc về nó, nhưng tôi không bao giờ nghe về đó các thuật ngữ rõ ràng hơn nữa, vòng lặp triển khai SDK (sử dụng vòng lặp đệ quy hoặc vòng lặp thông thường) trên mỗi thao tác:
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)
}
Câu hỏi của tôi là:
Chúng ta có thể xem xét việc triển khai Java trên cùng một thứ sẽ nhanh hơn nhiều không. (O (n) trong Java
vs O (bội số của n) trong Scala
)
Bạn trả lời là đơn giản và tốt, tuy nhiên @Rex Kerr toàn diện hơn. Cảm ơn. –