所以我只是学习新的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) 我已经了解了接口和抽象类之间的区别,但这个令人困惑.考虑这个接口和类.
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不是抽象类的超类?或者我错过了一些观点?
我已经浏览了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)