Java 8 Lambda堆栈出血

麦安德
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;


public class StackBleed {
public static int check(String s) {
if (s.equals("lambda")) {
throw new IllegalArgumentException();
}
return s.length();
}

@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
//      List lengths = new ArrayList();
List<String> argList = Arrays.asList(args);


Stream lengths2 = argList.stream().map((String name) -> check(name));
}
}

所以我查看了这篇文章http://www.takipiblog.com/2014/03/25/the-dark-side-of-lambda-expressions-in-java-8/并编写了类似的类,但使用JDK 8方法没有产生预期的异常。我想知道他们是否更改了JDK 8u5中的某些内容?

尼伯(JB Nizet)

您只在流上调用非终端操作。因此,您的代码不会消耗流中的数据。它所做的只是说:“当调用终端操作时,必须使用check()方法映射字符串”。

使用

List<Integer> transformed = 
    argList.stream().map((String name) -> check(name)).collect(Collectors.toList());

例如,然后对的调用collect()(即终端操作)将触发流元素上的迭代及其元素的转换。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章