Stream流
Stream流
Stream流的作用:
结合了Lambda表达式,简化集合、数组的操作
Stream流的使用步骤以及方法详解:
- 先得到一条Stream流(流水线),并把数据放上去。
/*
单列集合
*/
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"a","b","c","d","e");
Stream<String> stream1 = list.stream();
stream1.forEach(s -> System.out.println(s));
/*
双列集合
*/
HashMap<String,Integer> hm = new HashMap<>();
hm.put("aaa",1);
hm.put("bbb",2);
hm.put("ccc",3);
hm.put("ddd",4);
hm.put("eee",5);
hm.keySet().stream().forEach(s -> System.out.println(s));
hm.entrySet().stream().forEach(s -> System.out.println(s));
/*
数组
*/
int[] arr = {1,2,3,4,5};
Arrays.stream(arr).forEach(s-> System.out.println(s));
/*
散列数据,但是数据类型相同
*/
Stream.of(1,2,3,4,5).forEach(s-> System.out.println(s));
-
利用Stream流中的API进行各种操作
-
中间方法(过滤、转换):方法调用完毕之后还可以调用其他方法
注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据/** * @author 戒爱学Java * @date 2023/3/22 19:39 */ public class StreamDemo6 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list,"张无忌-10","赵敏-15","周芷若-20","张强-35","张三丰-60","张翠山-11","张良-22","王麻子-33","谢广坤-44", "赵四-25","赵敏-18"); ArrayList<String> list2 = new ArrayList<>(); Collections.addAll(list2,"小明","小子"); //过滤出来姓张的并且将这些名字打印输出 list.stream().filter(name -> name.startsWith("张")).forEach(name -> System.out.println(name)); System.out.println("------------------------------"); //获取前几个元素 list.stream().limit(3).forEach(name -> System.out.println(name)); System.out.println("------------------------------"); //跳过前几个元素。 list.stream().skip(3).forEach(name -> System.out.println(name)); System.out.println("------------------------------"); //元素去重 list.stream().distinct().forEach(name -> System.out.println(name)); System.out.println("=================="); //流的合并 Stream.concat(list.stream(),list2.stream()).forEach(s -> System.out.println(s)); System.out.println("--------------------------------"); //流里面进行数据转换 list.stream().map(s -> Integer.parseInt(s.split("-")[1])).forEach(age -> System.out.println(age)); } }
-
终结方法(统计、打印):最后一步,调用完毕之后,不能调用其他方法
/** * @author 戒爱学Java * @date 2023/3/22 20:08 */ public class StreamDemo7 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list,"张无忌","赵敏","周芷若","张强","张三丰","张翠山","张良","王麻子","谢广坤", "赵四","赵敏"); //遍历 list.stream().forEach(name -> System.out.println(name)); System.out.println("-------------------------"); //统计 long count = list.stream().count(); System.out.println(count); System.out.println("-------------------------"); //收集流中的数据,并放到数组当中 String[] array = list.stream().toArray(value -> new String[value]); System.out.println(Arrays.toString(array)); } }
-
收集方法collect详解
collect(Collector collector) 收集流中的数据,放到集合当中(List、Set、Map)
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author 戒爱学Java
* @date 2023/3/23 8:23
*/
public class StreamDemo8 {
public static void main(String[] args) {
/**
* collector(Collector collector)
*
* 注意点:
* 如果我们要把数据收集到Map集合当中,那么键是不能重复的,否则代码会报错
*/
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张无忌-男-10","赵敏-女-15","周芷若-女-20","张强-男-35","张三丰-男-60",
"张翠山-男-11","张良-男-22","王麻子-男-33","谢广坤-男-44");
/**
* 收集到List集合当中
* 需求:
* 把所有男性收集起来
*/
List<String> newList = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());
System.out.println(newList);
Set<String> newSet = list.stream().filter(s -> "男".equals(s.split("-")[1]))
.collect(Collectors.toSet());
System.out.println(newSet);
/**
* toMap
* 键:姓名
* 值:年龄
*
* toMap :
* 参数一:
* Function泛型一:表示流中每一个数据的类型
* 泛型二:表示Map集合中键的数据类型
* 方法apply形参:依次表示流中的每一个数据
* 方法体:生成键的代码
* 返回值:已经生成的键
* 参数二:
* * Function泛型一:表示流中每一个数据的类型
* * 泛型二:表示Map集合中键的数据类型
* * 方法apply形参:依次表示流中的每一个数据
* * 方法体:生成值的代码
* * 返回值:已经生成的值
*/
Map<String, Integer> newMap = list.stream().filter(s -> "男".equals(s.split("-")[1])).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]);
}
}));
//Lambda表达式
Map<String, Integer> newMap2 = list.stream().filter(s -> "男".equals(s.split("-")[1]))
.collect(Collectors.toMap(s -> s.split("-")[0], s -> Integer.parseInt(s.split("-")[2])));
System.out.println(newMap);
System.out.println(newMap2);
}
}