【发布时间】:2017-08-23 01:55:10
【问题描述】:
我正在学习 Java8 esp Stream API。 但仍然不明白流和地图的工作原理。
我对流的理解是 当我使用 peek() 和 forEach() 时,结果将是 1111 2222,但 println() 的结果是混合的。
我想如果我使用 map().filter().map().filter() 那么首先执行 map() 并返回到流并执行下一个 filter() 并像这样移动到下一个。所以我对这个结果很困惑。
这是我的代码
package exam_20170823;
import java.io.File;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamEx2 {
public static void main(String[] args) {
File[] fileArr = {
new File("Ex1.java"),
new File("Ex1.bak"),
new File("Ex1.txt"),
new File("Ex2.java"),
new File("Ex1")
};
/*1) make stream
2) find filename extension
3) change 2) to uppercase
4) remove duplicate
5) print
*/
Stream<File> fileStream = Stream.of(fileArr);
fileStream.map(s->s.getName())
.filter(s -> s.indexOf(".") != -1)
.peek(a -> System.out.println(a))
.map(s -> s.substring(s.indexOf(".")+1).toUpperCase())
.distinct()
.forEach(s -> System.out.println(s));
}
}
这就是结果
Ex1.java
JAVA
Ex1.bak
BAK
Ex1.txt
TXT
Ex2.java
只是我想知道为什么结果不是这样? -> "Ex1.java,Ex1.bak,Ex1.txt,Ex2.java" 先打印"JAVA,BAK,TXT"
我首先使用 peek(),最后使用 foreach() 所以我期望
使用 peek() 后,流将是 Ex1.java,Ex1.bak,Ex1.txt,Ex2.java
然后接下来我使用 map() 所以它必须有JAVA,BAK,TXT。和
最后使用 foreach() 所以流的每一件事都将被打印出我所期望的,但它是如此混乱。有谁能帮我理解为什么?
【问题讨论】:
-
你在哪里看到
1111和2222??? -
不是字面上我看到的 1111 2222 只是我的意思是输出顺序:)
-
输出的顺序看起来不错。如果您有不清楚的地方,请更具体和准确。
标签: dictionary foreach filter java-8 java-stream