Java进阶之旅第六天
Stream流
Stream的思想
- Stream流中引入函数式编程的思想,以类似流水线的方式处理数据,使得代码更加高效整洁
- Stream中提供并行处理的能力,可以将数据分成多个子任务,并行处理
各类型的调用方法
类型 | 方法 | 说明 |
---|
单列集合 | default Stream stream | Collection中默认的方法 |
双列集合 | 无(需要转成单列结合后使用 | 无法直接使用stream流 |
数组 | public static Stream stream(T[] array) | Arrays工具类的静态方法 |
一堆零散的数据 | public static Stream of(T…values) | Stream接口中的静态方法 |
- Stream接口中静态方法of的细节:
- 1.方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
- 2.但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中
代码演示
System.out.println("----单列集合---");
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(2);
list.stream().forEach(s-> System.out.println(s));
System.out.println("----双列集合---");
HashMap<String,Integer> hm = new HashMap<>();
hm.put("1",2);
hm.put("2",1);
hm.put("3",3);
hm.keySet().stream().forEach(s-> System.out.println(s));
hm.entrySet().stream().forEach(s-> System.out.println(s));
System.out.println("----数组---");
int[] arr1 = {1,2,3};
Arrays.stream(arr1).forEach(s-> System.out.println(s));
System.out.println("----零散的数据---");
Stream.of(1,2,3,4).forEach(s-> System.out.println(s));
System.out.println("----细节1----");
String[] arr2 = {"1","2","3"};
Stream.of(arr2).forEach(s-> System.out.println(s));
System.out.println("----细节2----");
int[] arr3 = {1,2,3};
Stream.of(arr3).forEach(s-> System.out.println(s));
结果
----单列集合---
1
3
2
----双列集合---
1
2
3
1=2
2=1
3=3
----数组---
1
2
3
----零散的数据---
1
2
3
4
----细节1----
1
2
3
----细节2----
[I@6d03e736
Stream中间方法
名称 | 说明 |
---|
Stream filter(Predicate<?super T> predicate) | 过滤 |
Stream limit(long maxSize) | 获取前几个元素 |
Stream skip(long n) | 跳过前几个元素 |
Stream distinct() | 元素去重,依赖(hashCode和equals方法 |
static Stream concat(Stream a,Stream b) | 合并a和b两个流为一个流 |
Stream map(Function<T,R> mapper) | 转换流中的数据 |
- 注意:
- 1.中间方法,返回新的Stream流,原来的Stream流只使用一次,建议使用链式编程
- 2.修改Stream流中的数据,不会影响原来集合或者数组中的数据
代码演示
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张小兰","小名","小肖","张三","张三");
System.out.println("----过滤(留下第一个字是小的----");
list.stream().filter(s->s.startsWith("小")).forEach(s-> System.out.println(s));
System.out.println("----获取前几个元素");
list.stream().limit(3).forEach(s-> System.out.println(s));
System.out.println("----跳过前几个元素");
list.stream().skip(3).forEach(s-> System.out.println(s));
System.out.println("----skip和limit结合使用获取'小肖'");
list.stream().skip(2).limit(1).forEach(s-> System.out.println(s));
System.out.println("----元素去重(去除张三");
list.stream().distinct().forEach(s -> System.out.println(s));
System.out.println("----合并a和b两个流为一个流");
ArrayList<String> list2 = new ArrayList<>();
Collections.addAll(list2,"张小第","小哦");
Stream.concat(list.stream(),list2.stream()).forEach(s-> System.out.println(s));
System.out.println("----转换流中的数据(获取年龄并打印");
ArrayList<String> list3 = new ArrayList<>();
Collections.addAll(list3,"张小兰-14","小名-15");
System.out.println("----不使用lambda表达式");
list3.stream().map(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
String[] arr = s.split("-");
return Integer.parseInt(arr[1]);
}
}).forEach(s-> System.out.println(s));
System.out.println("----使用lambda表达式");
list3.stream().map(s->Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));
结果
----过滤(留下第一个字是小的----
小名
小肖
----获取前几个元素
张小兰
小名
小肖
----跳过前几个元素
张三
张三
----skip和limit结合使用获取'小肖'
小肖
----元素去重(去除张三
张小兰
小名
小肖
张三
----合并a和b两个流为一个流
张小兰
小名
小肖
张三
张三
张小第
小哦
----转换流中的数据(获取年龄并打印
----不使用lambda表达式
14
15
----使用lambda表达式
14
15
Stream流的终结方法
名称 | 说明 |
---|
forEach(Consumer action) | 遍历 |
long count() | 统计 |
toArray() | 收集流中的数据,放到数组中 |
collect(Collector collector)(难点) | 收集流中的数据,放到集合中 |
- toArray()方法的作用: 负责创建一个指定类型的数组
代码
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张小兰","小名");
System.out.println("----遍历");
System.out.println("----不使用lambda");
list.stream().forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
System.out.println("----使用lambda");
list.stream().forEach(s-> System.out.println(s));
System.out.println("----统计");
long count = list.stream().count();
System.out.println(count);
System.out.println("----收集流中的数据,放到数组中");
System.out.println("---空参构造");
Object[] arr1 = list.stream().toArray();
System.out.println(Arrays.toString(arr1));
System.out.println("---非空参构造");
String[] arr2 = list.stream().toArray(new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
return new String[value];
}
});
System.out.println(Arrays.toString(arr2));
System.out.println("----表达式");
String[] arr3 = list.stream().toArray(value -> new String[value]);
System.out.println(Arrays.toString(arr3));
System.out.println("---收集流中的数据,放到集合中");
System.out.println("收集到list集合中");
List<String> arrl = list.stream().collect(Collectors.toList());
System.out.println(arrl);
System.out.println("收集到set集合中");
Set<String> arrs = list.stream().collect(Collectors.toSet());
System.out.println(arrs);
System.out.println("收集到map集合中");
Map<String,String> arrm = list.stream().collect(Collectors.toMap(new Function<String, String>() {
@Override
public String apply(String s) {
return s;
}
}, new Function<String, String>() {
@Override
public String apply(String s) {
return s;
}
}));
System.out.println(arrm);
System.out.println("---使用lambda表达式");
Map<String,String> arrm2 = list.stream().collect(Collectors.toMap(
s -> s ,
s->s));
System.out.println(arrm2);
结果
----遍历
----不使用lambda
张小兰
小名
----使用lambda
张小兰
小名
----统计
2
----收集流中的数据,放到数组中
---空参构造
[张小兰, 小名]
---非空参构造
[张小兰, 小名]
----表达式
[张小兰, 小名]
---收集流中的数据,放到集合中
收集到list集合中
[张小兰, 小名]
收集到set集合中
[张小兰, 小名]
收集到map集合中
{张小兰=张小兰, 小名=小名}
---使用lambda表达式
{张小兰=张小兰, 小名=小名}