本文共 1506 字,大约阅读时间需要 5 分钟。
在Java的 Streams处理中,filter、map和flatMap是三种常用且强大的方法,它们在数据处理流程中发挥着重要作用。本文将分别介绍这三种方法的特点及使用场景。
filter方法的核心作用是对流中的元素进行过滤,只保留满足特定条件的元素。该方法的参数是一个Predicate
Listwords = ...;words.stream() .filter(word -> word.length() > 12) .collect(Collectors.toList());
上述代码将从words流中筛选出长度大于12的单词。需要注意的是,Predicate接口可以通过方法引用或lambda表达式来实现。通过filter方法,我们可以高效地对流数据进行初步筛选,减少后续处理的负担。
map方法的主要功能是对流中的元素进行转换。它接收一个函数,该函数将流中的元素从一个类型转换为另一个类型。例如:
Listwords = ...;words.stream() .map(String::toLowerCase) .collect(Collectors.toList());
上述代码将将所有单词转换为小写形式。map方法的一个显著优势在于,它能够将流中的元素转换为多种不同的形式,例如将字符串转换为数字或日期等。在实际应用中,map方法常常与其他方法结合使用,例如与flatMap一起使用时,可以将流中的元素拆分成多个子流。
flatMap方法与map方法类似,但它的输出是多个流的Flatten操作。它的主要用途是将流中的元素拆分成多个子流,并将这些子流合并成一个单独的流。例如:
Listwords = ...;words.stream() .flatMap(word -> Arrays.asList(word.split(""))) .collect(Collectors.toList());
上述代码将将每个单词拆分成一个或多个子单词,然后将所有子单词合并成一个单一的流。例如,对于单词["hello", "world"],flatMap方法将返回一个流["h", "e", "l", "l", "o", "w", "o", "r", "l", "d"]。
需要注意的是,flatMap方法的输出类型是List
通过上述示例可以看出,map和flatMap方法在功能上有明显的区别:
例如,假设输入流是["you", "name"]:
使用map方法:
.map(String::toLowerCase)
返回的流是["you", "name"]。
使用flatMap方法:
.flatMap(word -> Arrays.asList(word.split(""))) 返回的流是["y", "o", "u", "r", "n", "a", "m", "e"]。
这两种方法各有优劣,具体选择取决于实际需求。
转载地址:http://ggpfk.baihongyu.com/