关于Java 8中的流,有大量有关流的信息和教程。我发现的大部分内容都很好地解释了流的各个元素如何在概念层面上工作。但是,我没有遇到过很多材料,这些材料描述了JVM实际上如何实现和执行流。
考虑在使用流之间比较Collection
上的操作,并使用旧学校之前的Java 8方式。底层的Bytecodes在这两种方法之间看起来是否相同?性能是否相同?
为了使这个具体,请考虑以下示例,其中我需要找到名称中包含单词“fish”的所有鱼,然后将每个匹配鱼的第一个字母大写。 (是的,我知道Hagfish实际上并不是一条鱼,但我没有匹配的鱼名。)
List<String> fishList = Arrays.asList("catfish", "hagfish", "salmon", "tuna", "blowfish");
// Pre Java-8 solution
List<String> hasFishList = new ArrayList<String>();
for (String fish : fishList) {
if (fish.contains("fish")) {
String fishCap = fish.substring(0, 1).toUpperCase() + fish.substring(1);
hasFishList.add(fishCap);
}
}
// Java-8 solution using streams
List<String> hasFishList = fishList.stream()
.filter(f -> f.contains("fish"))
.map(f -> f.substring(0, 1).toUpperCase() + f.substring(1))
.collect(Collectors.toList());
你可能对这两种方法在字节顺序上有所不同的任何见解都很棒。而一些实际的字节代码会更好。