Java8常用流操作

collect(toList())

collect(toList()) 方法有 Stream 里的值生成一个列表,是一个及早求值操作。
Stream 的 of 方法使用一组初始值生成新的 Stream 。

List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList());

map

如果有一个函数可以将一种类型转换成另外一种类型,map 操作就可以使用该函数,将一个流中的值转换成一个新的流。
实例:使用 map 将字符转成大写形式。

// lambda表达式
Stream.of("a", "b", "c").map(x->x.toUpperCase()).forEach(System.out::println);
// 或者
// 方法引用
Stream.of("a", "b", "c").map(String::toUpperCase).forEach(System.out::println);
/**output:
A
B
C
**/

map 方法需要传递一个 Function 参数,Function 是需要一个参数和一个返回值的函数接口。
map.jpg

function.jpg

filter

遍历数据并检查其中的元素时,可尝试使用 Stream 中提供的新方法 filter。
实例:找出符合的字符串。

Stream.of("abc", "1ab", "ab").filter(value->value.startsWith("ab")).forEach(System.out::println);
// output:
/*
abc
ab
*/

filter 方法需要 Predicate 接口作为参数,这个方法和 if 语句相同,返回值为 false 或者 true。只有 Lambda 表达式为 true 的元素被保留下来了。
filter.jpg

flatMap

flatMap 方法可用 Stream 替换值, 然后将多个 Stream 连接成一个 Stream。

List<Integer> together = Stream.of(asList(1, 2), asList(3, 4)).flatMap(numbers -> numbers.stream()).collect(toList());

调用 stream 方法, 将每个列表转换成 Stream 对象, 其余部分由 flatMap 方法处理。flatMap 方法的相关函数接口和 map 方法的一样,都是 Function 接口,只是方法的返回值限定为 Stream 类型罢了。
flatmap.jpg

max 和 min

Stream 上常用的操作之一是求最大值和最小值。

reduce

reduce 操作可以实现从一组值中生成一个值。在上述例子中用到的 count、min 和max 方法,因为常用而被纳入标准库中。事实上,这些方法都是 reduce 操作。
实例:使用 reduce 求和

int count = Stream.of(1, 2, 3).reduce(0, (acc, element) -> acc + element);

reduce.jpg
惰性求值和及早求值的区别:

只需要看返回值。如果返回值为 Stream 类型,那么就是惰性求值,如果返回值是另一个值或为空,那么就是及早求值。使用这些操作理想方式就是形成一个惰性求值链,最后一个及早求值的操作返回想要的结果。整个过程和构建这模式相似。

添加新评论