当我使用Java 8的新语法糖迭代一个集合时,例如
myStream.forEach(item -> {
// do something useful
});
Run Code Online (Sandbox Code Playgroud)
这不等同于下面的"旧语法"片段吗?
myStream.forEach(new Consumer<Item>() {
@Override
public void accept(Item item) {
// do something useful
}
});
Run Code Online (Sandbox Code Playgroud)
这是否意味着Consumer每次迭代集合时都会在堆上创建一个新的匿名对象?这需要多少堆空间?它有什么性能影响?这是否意味着我在迭代大型多级数据结构时应该使用旧样式for循环?
Loop.times(5, () -> {
System.out.println("looping");
});
Run Code Online (Sandbox Code Playgroud)
哪些有效编译到?
for(int i = 0; i < 5; i++)
System.out.println("looping");
Run Code Online (Sandbox Code Playgroud)
或类似的东西
new CallableInterfaceImpl(){
public void call(){
for(int i = 0; i < 5; i++)
System.out.println("looping");
}
}.call();
Run Code Online (Sandbox Code Playgroud)
它会替换(内联类),还是实际创建一个匿名类?
我需要检查两个列表中是否存在共同元素.我提出了两种方法来做到这一点:
方法01:循环
private boolean func01 (List<String> list1, List<String> list2) {
for (String group : list1) {
for (String funcGroup : list2) {
if (group.equals(funcGroup)) {
return true;
}
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
方法02:Lambda
private boolean func02 (List<String> list1, List<String> list2) {
return list1.stream().filter(list2::contains).findAny().isPresent();
}
Run Code Online (Sandbox Code Playgroud)
在我看来,我发现第一种方法更具可读性.我需要了解的是,比较这两种方法时是否存在差异或优势?
我正在阅读有关Java 8中提供的lambda表达式的两个博客和答案。
我无法弄清楚,单位lambda表达式是否对运行时有好处?
我从不同的来源复制了以下文本,这使我感到非常困惑。
一个答案是说-
“ lambda不会创建新的作用域,它们与封闭的块/环境共享相同的作用域”
在一个博客中-
“使用lambda表达式没有运行时的好处,所以我会谨慎使用它,因为我不介意写一些额外的代码行。”
从另一个博客-
“通过在方法中传递行为,又一个有益的lambda表达式顺序和并行执行支持”
所以对我来说,还有很多困惑。请帮助我清除此问题,以便在深入研究这些内容之前避免记住错误的方法。
我已经运行了以下代码,我可以说以下代码中的lambda表达式只是对匿名内部类及其在主线程上运行的替代。
List<Integer> list = new ArrayList<>();
list.add(12);
list.forEach(V -> {
System.out.println(V);
});
Run Code Online (Sandbox Code Playgroud)
我们是在减少时间复杂度还是空间复杂度?
据我所知,流比传统的旧编程更快。
但是,当我运行以下代码时,结果出乎我的意料。
public class Application {
public static void main(String[] args) {
long startTime = System.nanoTime();
int[] a = { 1, 2, 3, 4 };
int m = Arrays.stream(a).reduce(Integer.MIN_VALUE, Math::max);
long endTime = System.nanoTime();
long totalTime = endTime - startTime;
System.out.println(totalTime);
}
}
Run Code Online (Sandbox Code Playgroud)
输出为:22857304
public class Application {
public static void main(String[] args) {
long startTime = System.nanoTime();
int[] a = { 1, 2, 3, 4 };
int e = a.length;
int m = Integer.MIN_VALUE;
for (int i = 0; …Run Code Online (Sandbox Code Playgroud) java ×6
java-8 ×4
lambda ×4
benchmarking ×1
java-stream ×1
jvm ×1
jvm-hotspot ×1
kotlin ×1
performance ×1