of()接收数组并创建流,然后map()将每个元素都获取平方,distinct()去重,再使用collect()将流中的元素变成List
@Test
public void mapTest(){
List<Integer> squaresList = Stream.of(3, 2, 2, 3, 7, 3, 5)
.map(e -> e*e)
.distinct()
.collect(Collectors.toList());
}
Collection可使用stream()获取流,filter()过滤出空字符串,count()计数
@Test
public void filerTest(){
List<String> stringList = Arrays.asList("abc", "d", "ef", "ghi", "","123", "bcd","");
long count = stringList.stream().filter(string -> string.isEmpty()).count();
// 2
}
filter()过滤出非空字符串,skip()过滤掉前三个,并使用逗号间隔生成String
@Test
public void collectTest(){
List<String> stringList = Arrays.asList("abc", "d", "ef", "ghi", "","123", "bcd","");
String mergedString = stringList.stream().filter(string -> !string.isEmpty()).skip(3).collect(Collectors.joining(", "));
// ghi, 123, bcd
}
一些产生统计结果的收集器也非常有用。
它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。
@Test
public void statTest(){
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("列表中最大的数 : " + stats.getMax());//7
System.out.println("列表中最小的数 : " + stats.getMin());//2
System.out.println("所有数之和 : " + stats.getSum());//25
System.out.println("平均数 : " + stats.getAverage());//3.5714285714285716
}
并行执行,顺序可能会与原来的顺序不同。
filter()过滤出非空字符串,limit()过滤出前两个
@Test
public void parallelStreamTest(){
List<String> stringList = Arrays.asList("abc", "d", "ef", "ghi", "","123", "bcd","");
stringList = stringList.parallelStream().filter(string -> !string.isEmpty()).limit(2).collect(Collectors.toList());
// [abc, d]
}
合并两条未关闭的流,如果有个流先使用count(),collect()或forEach(),就会关闭流,那么合并时会报错
stream has already been operated upon or closed
@Test
public void concatTest(){
Stream<Integer> stream1 = Stream.of(1,2,3);
Stream<Integer> stream2 = Stream.of(4,5,6);
// 4,5,6,
Stream.concat(stream1, stream2).filter(e -> e > 3).forEach(e -> System.out.print(e + ","));
}