小编Sya*_*m S的帖子

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

所以我只是学习新的Java 8,特别是lambdas和日期和时间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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

// Parallel operation
books.par filter(_.author …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing lambda scala java-stream

33
推荐指数
1
解决办法
2407
查看次数

抽象类是否扩展了Object?

我已经了解了接口和抽象类之间的区别,但这个令人困惑.考虑这个接口和类.

interface I {
    public int hashCode();
    public boolean equals(Object obj);
}

class B implements I {
    // Works Fine
}
Run Code Online (Sandbox Code Playgroud)

这里工作正常,我不需要覆盖接口方法,因为Object是B的超类,并且这些方法在其中实现.

现在考虑这些

abstract class A {
    public abstract int hashCode();
    public abstract boolean equals(Object obj);
}

class C extends A {
    // Compile error because methods are not overridden
}
Run Code Online (Sandbox Code Playgroud)

为什么会导致编译错误?这是否意味着Object不是抽象类的超类?或者我错过了一些观点?

java abstract-class interface

24
推荐指数
2
解决办法
3145
查看次数

使用String的split方法进行混淆

我已经浏览了String的split方法文档,但结果并不像预期的那样.当我们将限制参数设置为负值的字符串拆分时,它总是附加一个空值.为什么要这样做?考虑一些情况

// Case 1
String str = "1#2#3#";
System.out.println(str.split("#").length); // Prints 3
System.out.println(str.split("#", -1).length); // Prints 4
Run Code Online (Sandbox Code Playgroud)

我期待的是印刷品3.

// Case 2
str = "";
System.out.println(str.split("#").length); // Prints 1
System.out.println(str.split("#", -1).length); // Prints 1
Run Code Online (Sandbox Code Playgroud)

现在因为没有找到匹配,所以通常的无限制拆分方法应该打印0但它创建一个空字符串的数组.

// Case 3
str = "#";
System.out.println(str.split("#").length); // Prints 0
System.out.println(str.split("#", -1).length); // Prints 2
Run Code Online (Sandbox Code Playgroud)

现在我有一个匹配和没有限制参数的拆分方法工作正常.它是我的预期输出,但为什么在这种情况下它不会像情况2那样创建一个空数组?

// Case 4
str = "###";
System.out.println(str.split("#").length); // Prints 0
System.out.println(str.split("#", -1).length); // Prints 4
Run Code Online (Sandbox Code Playgroud)

这里第一个分割方法是预期的,但为什么第二个方法给出4而不是3?

// Case 5
str = "1#2#3#";
System.out.println(str.split("#", 0).length); // Prints 3
System.out.println(str.split("#", …
Run Code Online (Sandbox Code Playgroud)

java regex string split

4
推荐指数
1
解决办法
114
查看次数