Така че тъкмо изучавах нова Java 8, специално ламбда и API за дата и час. Сравнявах го със scala. Основната ми идея беше да намеря разликата във времето за изпълнение между императив, поток и паралелен поток. Затова реших да създам приложение Library и да извърша някои операции като търсене, филтриране, сортиране и т.н. Създадох клас Library с поле за списък, наречено 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
Вашата помощ е много ценена. Благодаря.
sorted
се предоставя отscala.collection.SeqLike
само и просто делегира наjava.util.Arrays.sort(T[] a, Comparator<? super T> c)
: GitHub.Com/Scala/Scala/blob/master/src/library/scala/collection/ Така че самото сортиране никога няма да бъде паралелно, а само преобразуването към и от Java масива може. - person Jörg W Mittag   schedule 02.05.2014