问题
我一直在查看即将发布的Java update,即:Java 8 or JDK 8。是的,我很不耐烦,有很多新东西,但是,有一些我不明白的东西,一些简单的代码:
final Streamstream = Stream.of(1,2,3,4,5,6,7,8,9,10);
stream.flatMap();
javadoc是
public Stream flatMap(函数> mapper)返回一个流,该流包含将此流的每个元素替换为生成的映射流的内容的结果通过将提供的映射函数应用于每个元素。每个映射的流在其内容放入此流后关闭。 (如果映射的流为空,则使用空流。)这是一个中间操作。
如果有人创建了一些关于flatMap的简单实际示例,如何在以前的java版本Java[6,7]中编写代码以及如何使用Java 8编写相同的例程,我将不胜感激。
#1 热门回答(147 赞)
flatMapaStream没有任何意义,就像你在问题中显示的Stream一样。
但是,如果你有aStream>那么它会有意义,你可以这样做:
Stream> integerListStream = Stream.of(
Arrays.asList(1, 2),
Arrays.asList(3, 4),
Arrays.asList(5)
);
Stream integerStream = integerListStream .flatMap(Collection::stream);
integerStream.forEach(System.out::println);
哪个会打印:
1
2
3
4
5
要在Java 8之前执行此操作,你只需要一个循环:
List> integerLists = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3, 4),
Arrays.asList(5)
)
List flattened = new ArrayList<>();
for (List integerList : integerLists)
{
flattened.addAll(integerList);
}
for (Integer i : flattened)
{
System.out.println(i);
}
#2 热门回答(105 赞)
##编写例子
想象一下,你想要创建以下序列:1,2,3,3,3,3,4,4,4等等(换句话说:1x1,2x2,3x3等)
WithflatMapit可能看起来像:
IntStream sequence = IntStream.rangeClosed(1, 4)
.flatMap(i -> IntStream.iterate(i, identity()).limit(i));
sequence.forEach(System.out::println);
哪里:
IntStream.rangeClosed(1,4)创建一个从1到4(包括1和4)的int流
IntStream.iterate(i,identity())。limit(i)创建一个int i的长度为i的流 - 所以应用于i = 4它创建一个流:4,4,4,4
flatMap"展平"流并将其"连接"到原始流
使用Java <8,你将需要两个嵌套循环:
List list = new ArrayList<>();
for (int i = 1; i <= 4; i++) {
for (int j = 0; j < i; j++) {
list.add(i);
}
}
##真实世界的例子
假设我有aList其中eachTimeSeries基本上是aMap。我想得到一个所有日期的列表,其中至少有一个时间序列具有值.flatMap来救援:
list.stream().parallel()
.flatMap(ts -> ts.dates().stream()) // for each TS, stream dates and flatmap
.distinct() // remove duplicates
.sorted() // sort ascending
.collect(toList());
它不仅可读,而且如果你突然需要处理100k元素,只需添加parallel()即可在不编写任何并发代码的情况下提高性能。
#3 热门回答(16 赞)
从短语列表中提取排序ASC的唯一单词:
List phrases = Arrays.asList(
"sporadic perjury",
"confounded skimming",
"incumbent jailer",
"confounded jailer");
List uniqueWords = phrases
.stream()
.flatMap(phrase -> Stream.of(phrase.split(" +")))
.distinct()
.sorted()
.collect(Collectors.toList());
System.out.println("Unique words: " + uniqueWords);
......和输出:
Unique words: [confounded, incumbent, jailer, perjury, skimming, sporadic]