将要处理的集合,数组,I/O channel, 产生器generator 等看作一种流
流中间操作都会返回流对象本身,内部迭代
生成流
在 Java 8 中, 集合接口有两个方法来生成流:
stream()
− 为集合创建串行流(普通的一个个执行)parallelStream()
− 为集合创建并行流(多个线程并行操作元素,元素执行顺序可能会随机)
forEach
forEach()
来迭代流中的每个数据
XXX.stream().forEach(System.out::println);
map
映射每个元素到对应的结果
numbers.stream().map( i -> i*i);
filter
设置的条件过滤出元素
strings.stream().filter(string -> string.isEmpty()).forEach(System.out::println);
limit
获取指定数量的流
XXX.stream().limit(10).forEach(System.out::println);
sorted
排序
collect
public interface Stream<T> extends BaseStream<T, Stream<T>> {
<R, A> R collect(Collector<? super T, A, R> collector);
}
Collector
Collector是专门用来作为Stream的collect方法的参数
Collector是一个接口
Collectors
是JDK预实现Collector接口的工具类
toCollection
将流中的元素全部放置到一个新集合中返回
toList
将流中的元素放置到一个列表集合中去。这个列表默认为ArrayList。
toSet
将流中的元素放置到一个无序集set中去。默认为HashSet。
joining
joining的目的是将流中的元素全部以字符序列的方式连接到一起,可以指定连接符,甚至是结果的前后缀。
public class CollectorsTest {
public static void joiningTest(List<String> list){
// 无参方法
String s = list.stream().collect(Collectors.joining());
System.out.println(s);
// 指定连接符
String ss = list.stream().collect(Collectors.joining("-"));
System.out.println(ss);
// 指定连接符和前后缀
String sss = list.stream().collect(Collectors.joining("-","S","E"));
System.out.println(sss);
}
public static void main(String[] args) {
List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
joiningTest(list);
}
}
1234567891101212121121asdaa3e3e3e2321eew
123-456-789-1101-212121121-asdaa-3e3e3e-2321eew
S123-456-789-1101-212121121-asdaa-3e3e3e-2321eewE
mapping
首先对流中的每个元素进行映射,即map()操作,然后再将新元素以给定的Collector进行归纳。
List<Integer> ll = list.stream().limit(5).collect(Collectors.mapping(Integer::valueOf,Collectors.toList()));
等等
统计
主要用于int、double、long等基本类型上
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());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());