获取Stream流
原始数据 | 获取方法 | |
---|---|---|
单列集合 | default Stream stream() | collections中的默认方法 |
双列集合 | 无 | 无法直接使用Stream |
数组 | public static Stream stream(T[] array) | Arrays工具类中的静态方法 |
一堆零散数据 | public static Stream of(T… values) | Stream接口中的静态方法 |
1.单列集合获取
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"a","b","c","d","e");
Stream<String> stream = list.stream();
2.双列集合
HashMap<String, Integer> hm = new HashMap<>();
hm.put("aaa",111);
hm.put("bbb",222);
hm.put("ccc",333);
hm.put("ddd",444);
hm.put("eee",555);
// 2.1 第一种获取stream流
hm.keySet().stream().forEach(s -> System.out.println(s));
// 2.2 第二种获取Stream流
hm.entrySet().stream().forEach(entry ->{
System.out.println(entry.getKey()+"--------------------"+entry.getValue());
});
3.数组
// 3创建数组
int[] arr1 = {1,2,3,4,5,6,7,8,9,10};
String[] arr2 = {"a","b","c"};
// 3.1 获取Stream流
Arrays.stream(arr1).forEach(s -> System.out.println(s));
System.out.println("===============================");
Arrays.stream(arr2).forEach(s -> System.out.println(s));
// 注意:
// Stream接口中的静态方法of的细节
// 方法的形参是一个可变参数,可以传递一堆数据类型,也可以传递数据
// 但数组中必须是引用数据类型,如果传递的是基本数据类型,是会把整个数组当作一个元素。
Stream.of(arr1).forEach(s -> System.out.println(s)); // [I@568db2f2
Stream.of(arr2).forEach(s -> System.out.println(s)); // a b c
4.零散数据
// 4零散数据
System.out.println("零散数据");
Stream.of(1,2,3,4,5,6).forEach(s -> System.out.println(s));
2.中间方法
filter、limit、skip、distinct、concat、map
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张无忌-34","周芷若-44","赵敏-55","张三峰-88");
// 数据转换
// 获取年龄
list.stream().map(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
String[] split = s.split("-");
String ageString = split[1];
int age = Integer.parseInt(ageString);
return age;
}
});
list.stream().map((s -> Integer.parseInt(s.split("-")[1])));
3.终结方法
/*
终结方法
void forEach(Consumer action) 遍历
long count() 统计
toArray() 收集数据的数据,放到数组中
collect(Collector collector) 收集流中的数据,放到集合中
*/
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张无忌","周芷若","赵敏","张三峰");
// 1.遍历
list.stream().forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
// Lambda表达式写法
list.stream().forEach(s -> System.out.println(s));
// 2.统计数量
long count = list.stream().count();
// 3.toArray() 将流中的数据收集到数组中
list.stream().toArray(new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
return new String[value];
}
});
// value:创建数组的长度
String[] strings = list.stream().toArray(value -> new String[value]);
/*
collect(Collector collector) 收集流中的数据,放到集合中
*/
ArrayList<String> list2 = new ArrayList<>();
Collections.addAll(list,"张五级-男-23","周芷若-女-22","赵敏-女-21","张翠山-男-23","张三丰-男-83");
// 把集合收集到List集合中
// 需求:
// 把所有男性收集起来
List<String> collect = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());
System.out.println(collect);
// 把集合收集到Set集合中
// 需求:
// 把所有女性收集起来
Set<String> collect1 = list.stream().filter(s -> "女".equals(s.split("-")[1])).collect(Collectors.toSet());
System.out.println(collect1);
// 收集到map中
/*
toMap: 参数一表示键的生成规则
参数二表示值的生成规则
参数一:Function 泛型一:表示数据流中的每一个数据类型
泛型二:表示Map集合中键的数据类型
返回值:已经生成的键
参数二:Function 泛型一:表示数据流中的每一数据类型
泛型二:表示Map集合中值的数据类型
已经生成的值
方法apply形参:依次表示流中的每一个数据
方法体:生成值的代码
返回值:已经生成的值
注意:收集到Map中的数据键不可以重复,否则会报错。
*/
Map<String, Integer> collect2 = list.stream().collect(Collectors.toMap(new Function<String, String>() {
@Override
public String apply(String s) {
return s.split("-")[0];
}
}, new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s.split("-")[2]);
}
}));
Map<String, Integer> collect3 = list.stream().collect(Collectors.toMap(s -> s.split("-")[0], s -> Integer.parseInt(s.split("-")[2])));
System.out.println(collect2);
System.out.println(collect3);