流只能使用一次
流Stream的测试
遗憾的是, 流有一个方法让你能查看每个值, 同时能继续操作流。 这就是 peek 方法。 例7-18 使用 peek 方法重写了前面的例子, 输出流中的值, 同时避免了重复的流操作。
例 7-18 使用 peek 方法记录中间值
Set<String> nationalities= album.getMusicians()
.filter(artist -> artist.getName().startsWith("The"))
.map(artist -> artist.getNationality())
.peek(nation -> System.out.println("Found nationality: " + nation))
.collect(Collectors.<String>toSet());
使用 peek 方法还能以同样的方式, 将输出定向到现有的日志系统中, 比如 log4j、 java.util.logging 或者 slf4j。
例子:
package com.mmmm.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.mmmm.model.Album;
import com.mmmm.model.Artist;
import com.mmmm.model.Track;
public class Test_0506_04 {
public static void main(String[] args) {
List<Artist> musicians=new ArrayList<Artist>();
musicians.add(new Artist("The JiaKeChong",Arrays.asList("zhangsan","lisi","wangwu") , "Americ"));
musicians.add(new Artist("The TFBOYS",Arrays.asList("wangyuan","wang","yiyangqianxi") , "China"));
musicians.add(new Artist("The xiha",Arrays.asList("lili") , "Italy"));
musicians.add(new Artist("The yangmi",Arrays.asList("lilian") , "Italy"));
List<Track> trackList_1 = new ArrayList<>();
trackList_1.add(new Track("song_01"));
Album album=new Album("xingxing", trackList_1, musicians);
Set<String> nationalities=
musicians.stream()
.filter(artist -> artist.getName().startsWith("The"))
.map(artist -> artist.getOrigin())
.peek(nation -> System.out.println("Found nationality: " + nation))
.collect(Collectors.<String>toSet());
System.out.println(nationalities);
}
}
要点回顾
(1) 重构遗留代码时考虑如何使用 Lambda 表达式, 有一些通用的模式。
(2)如果想要对复杂一点的 Lambda 表达式编写单元测试, 将其抽取成一个常规的方法。
(3) peek 方法能记录中间值, 在调试时非常有用。