有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java 8并行排序与Scala并行排序

所以我只是在学习新的Java8,特别是lambdas和日期时间api。我把它和scala做了比较。我的基本想法是找出命令、流和并行流之间的执行时间差。因此,我决定创建一个库应用程序,并执行一些操作,如搜索、筛选、排序等。我创建了一个库类,其中包含一个名为books的列表字段,并用1000本书填充它。然后创建了一个用于搜索的功能界面,并在所有三种样式中执行了一些操作。一切都很顺利。我的代码是:

// Functional Interface
interface Search<T> {
    public void search(T t);
}

// Library class
final Library library = new Library();
// This just creates some random book objects.
final List<Book> books = collectBooks();

final Search<List<Book>> parallelSearch = (bks) -> library.findAndPrintBooksParallel(bks);

// Parallel Operations
private void findAndPrintBooksParallel(List<Book> books) {
    books.parallelStream()
        .filter(b -> b.getAuthor().equals("J.K. Rowling"))
        .sorted((x,y) -> x.getAuthor().compareTo(y.getAuthor()))
        .map(Book::getIsbn)
        .forEach(Library::waitAndPrintRecord);
}

现在我尝试在scala中重新创建相同的程序,看看执行速度是否更快?令人惊讶的是,scala不允许我进行并行排序(或者可能是我不知道)。我的scala库是

// Again some random book objects as a list
val books = collectBooks

// Parallel operation
books.par filter(_.author == "J.K. Rowling") map (_.isdn) foreach waitAndPrint

这里books.par给出了一个ParSeq。这没有排序方法。有没有办法用scala中的图书列表创建一个并行排序。所以我可以写一些像:

books.par filter(_.author == "J.K. Rowling") sortWith (_.author < _.author) map (_.isdn) foreach waitAndPrint

非常感谢你的帮助。谢谢


共 (2) 个答案

  1. # 1 楼答案

    我对scala非常陌生,但就我的理解而言:排序本身永远不会是并行的,只有与Java数组的转换可能是并行的。 排序由scala提供。收集我只喜欢 请尝试以下链接: github。Com/Scala/Scala/blob/master/src/library/Scala/collection/

  2. # 2 楼答案

    可以在scala中实现并行排序,例如http://blog.yunglinho.com/blog/2013/03/19/parallel-external-merge-sort/。我不知道为什么ParSeq不在其API中提供排序。请注意.par有许多替代方法,因此不必假设您的ParSeq结果通常代表Scala并行性。(但基准是很有价值的,我希望你的基准很好)