1.描述
Classes to support functional-style operations on streams of elements, such as map-reduce transformations on collections.
翻译成中文就是:这个类用于支持元素流上的功能样式操作,例如集合上的映射还原转换。就是说一般用来操作集合:将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,
比如筛选, 排序,聚合等。对应的包:Package java.util.stream
。
2.用法
1.创建流的方式
stream()
− 为集合创建串行流。
parallelStream()
− 为集合创建并行流。
栗子:
List<String> listStrings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = listStrings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
listStrings.stream()
:就是为集合listStrings创建流.,并筛选(filter())掉空字符串。
2.主要方法
1.filter
filter 方法用于通过设置的条件过滤出元素。
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取非空字符串
List<String> filtered2 = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
最后list的内容为:("abc", "bc", "efg", "abcd","jkl")
//返回isStudent==true的Person集合
List<Person> result = lp.stream().filter(Person::isStudent).collect(toList());
2.forEach
forEach 用于迭代流中的每个数据(遍历)。
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
//在控制台打印出10个随机数
3.limit
limit 方法用于获取指定数量的流(获取指定的前n个数值)。
4.skip
skip 跳过。
//跳过前3个(不取前3个值,其余都取)
List<Person> result33 = lp.stream().skip(3).collect(toList());
5.sorted
sorted 方法用于对流进行排序(从小到大)
Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);
//最后内容:打印出10个由小到大的随机数
6.map
map 方法用于映射每个元素到对应的结果(流会将每一个元素输送给map函数,并执行map中的Lambda表达式,最后将执行结果存入一个新的流中)。
//例子1:
List<Integer> numbers2 = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
Set<Integer> squaresList2 = numbers2.stream().map(i -> i*i).collect(Collectors.toSet());
//最后set集合内容:(49,4,9,25)
//例子2:
//获取每个人的名字并放到list中
List<String> result2 = lp.stream().map(Person::getName).collect(toList());
7.Collectors
Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串。
//转成set
List<Integer> numbers3 = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
Set<Integer> squaresList3 = numbers3.stream().map(i -> i*i).collect(Collectors.toSet());
//合并字符串
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
//转成list(string)
List<String> result3 = lp.stream().map(Person::getName).collect(toList());
8.统计
获取最大值,最小值,总数等。
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("列表中最小的数 : " + stats.getMin());
//上面两句等同于 下面的那个
OptionalInt a = numbers.stream().mapToInt((x) -> x).min();
int a2 = a.getAsInt(); //转成int
System.out.println("列表中最大的数 : " + stats.getMax());//-->max()
System.out.println("列表中最小的数 : " + stats.getMin());//-->min()
System.out.println("所有数之和 : " + stats.getSum());//-->sum()
System.out.println("平均数 : " + stats.getAverage());//-->average()
System.out.println("所有数的个数 : " + stats.getCount());//-->count()
long a3 = numbers.stream().mapToInt((x) -> x).summaryStatistics().getCount();
int a4 = numbers.stream().mapToInt((x) -> x).sum();
OptionalDouble a5 = numbers.stream().mapToInt((x) -> x).average();
double a6 = a5.getAsDouble();
//有些的返回值是Optional,可通过getAsxx返回对应的基本数据类型。
9.其它
是否匹配任意一个元素anyMatch()
是否匹配所有元素:allMatch()
是否未匹配所有元素:noneMatch()
能够从流中随便选一个元素出来()
//是否有人是学生
boolean lp1 = lp.stream().anyMatch(Person::isStudent);
//随机挑一个人
Optional<Person> person = lp.stream().findAny();
10.流的合并
Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串。
List(String) list = new ArrayList<String>();
list.add("I am a boy");
list.add("I love the girl");
list.add("But the girl loves another girl");
List<String> a222 = list.stream().map(line->line.split(" ")).map(Arrays::toString).distinct().collect(Collectors.toList());
a222.forEach(System.out::println);
//首先将list变成流:list.stream();
//按空格分词:list.stream().map(line->line.split(" "));
//分完词之后,每个元素变成了一个String[]数组。将每个String[]变成流:list.stream().map(line->line.split(" ")).map(Arrays::stream)
//list.stream() //将list变成流:list.stream();
//.map(line->line.split(" "));
//控制台输出结果为:
[I, am, a, boy]
[I, love, the, girl]
[But, the, girl, loves, another, girl]
3.总结
作为jdk1.8新出的特性,流的作用就是简化集合的操作,以前需要写循环或者多行代码来处理,现在直接一个流搞定。