那位先生

个人站

前世五百次回眸,才能换得今生的一次擦肩而过。


jdk1.8特性--stream

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新出的特性,流的作用就是简化集合的操作,以前需要写循环或者多行代码来处理,现在直接一个流搞定。

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
你说多少就多少

比五毛钱特效专业哦