2011-09-23 37 views
13

Tôi có chức năng Scala foo(bs : Stream[Bar]) : Bat mà tôi cần gọi từ mã Java. Làm cách nào để tạo luồng "bs" (Stream[Bar]) trong Java và tạo ra các đối tượng Bar của nó một cách lười biếng?Làm thế nào để khởi tạo và điền một Dòng Scala trong Java?

+0

Luồng phát trực tiếp từ đâu? Bạn có nó trong một bộ sưu tập Java, bạn sẽ nhận được nó thông qua sự kiện, những gì? Không biết điều đó, không thể khẳng định điều gì sẽ là cách tốt nhất về nó. –

+0

Trong vấn đề thực tế của tôi, tôi có một Vector Java. Tôi sẽ quan tâm đến việc hiểu những gì/lý do tại sao tôi sẽ làm một cái gì đó khác nhau nếu nó được tạo ra từ một sự kiện. –

+0

Đối với vấn đề của bạn @Travis câu trả lời là con đường để đi. Tạo ra từ một sự kiện là khó khăn hơn - một ví dụ tốt là thư viện sys.process của Scala, có thể tạo ra một 'Stream' từ' OutputStream' của một tiến trình đang chạy. –

Trả lời

8

Tùy thuộc vào những gì cần phải được trong dòng, nó có thể là dễ nhất để tạo một java.util.Iterator và sau đó chuyển đổi này cho một người Stream qua một scala.collection.Iterator:

import scala.collection.JavaConverters; 
import scala.collection.immutable.Stream; 

... 

List<String> list = new ArrayList<String>(); 

\\ Fill the list somehow... 

Iterator<String> it = list.iterator(); 

Stream<String> stream = JavaConverters.asScalaIteratorConverter(it) 
             .asScala().toStream(); 

Trình lặp không nhất thiết phải xuất phát từ bộ sưu tập — chúng ta có thể dễ dàng tạo luồng vô hạn bằng cách triển khai trình lặp của riêng chúng ta:

Stream<String> stream = JavaConverters.asScalaIteratorConverter(
    new Iterator<String>() { 
    int i = 0; 
    public boolean hasNext() { return true; } 
    public void remove() { throw new UnsupportedOperationException(); } 
    public String next() { return Integer.toString(i++); } 
    } 
).asScala().toStream(); 

Nó không đẹp như một cái gì đó như Stream.iterate(0)(_ + 1).map(_.toString), nhưng nó hoạt động.

+0

Rất dễ sử dụng. Cám ơn! –

0

Các bạn đã thử

scala.collection.immutable.Stream bs = new scala.collection.immutable.Stream() 

?

+0

Tôi đã chỉnh sửa câu hỏi để cố gắng làm rõ rằng tôi đang tìm kiếm một ví dụ hoàn chỉnh về tạo luồng dựa trên Java (không chỉ là instantiation) –

10

Cách tốt nhất là sử dụng một trong các nhà máy có sẵn trên Stream đối tượng đồng hành. Để sử dụng chúng hữu ích nhất, bạn cũng cần triển khai Function1, có thể thực hiện bằng cách mở rộng AbstractFunction1.

Dưới đây là một ví dụ:

import scala.collection.immutable.Stream; 
import scala.runtime.AbstractFunction1; 

public class Ex { 
    public Stream<Integer> stream = Stream.iterate(0, new Increment()); 
} 

class Increment extends AbstractFunction1<Integer, Integer> { 
    public Integer apply(Integer v1) { 
     return v1 + 1; 
    } 
} 
+0

Tôi chấp nhận câu trả lời @Travis 'vì đó là câu trả lời đơn giản nhất cho vấn đề cụ thể của tôi, nhưng câu trả lời này rất hữu ích cho trường hợp tổng quát hơn. –

Các vấn đề liên quan