Stream流
先获取一条Stream流,并把数据放上去
代码实现
//1.单列集合获取Stream流
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c", "d", "e");
//获取到一条流水线, 并把集合中的数据放到流水线上
Stream<String> stream1 = list.stream();
//使用终结方法打印一下流水线上的所有数据
//匿名内部类写法
stream1.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
//简化写法
list.stream().forEach(s -> System.out.println(s));
//1.创建双列集合
HashMap<String, Integer> hm = new HashMap<>();
//2.添加数据
hm.put("aaa", 111);
hm.put("bbb", 222);
hm.put("ccc", 333);
hm.put("ddd", 444);
//3.第种获取stream流
hm.keySet().stream().forEach(s -> System.out.println(s));
//4.第二种获取stream流
hm.entrySet().stream().forEach(s -> System.out.println(s));
//1.创建数组
int[] arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//2.获取stream流
Arrays.stream(arr1).forEach(s -> System.out.println(s));
//注意:
//Stream接口中静态方法of的细节
//方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
//但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中。
Stream.of(arr1).forEach(s -> System.out.println(s));//[I@41629346 地址值
注意:
Stream接口中静态方法of的细节
方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中
中间方法
注意
1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
代码
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张翠山”,“张良", "王二麻子", "谢广坤");
//filter过滤 把张开头的留下,其余数据过滤不要
list.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
//如果返回值为true,表示当前数据留下
//如果返回值为false,表示当前数据舍弃不要
return s.startsWith("张");
}
}).forEach(s -> System.out.println(s));
//简写
list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));
//转换方法
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张无忌-15", "周芷若-14", "赵敏-13", "张强-20", "张三丰-100", "张翠山-40", "张良-35","王二麻子-37");
//需求:只获取里面的年龄并进行打印
//String->int
//第一个类型:流中原本的数据类型
//第二个类型:要转成之后的类型
//app1y的形参s:依次表示流里面的每一个 数据
//返回值:表示转换之后的数据
list.stream().map(new Function<String,Integer>() {
@Override
public Integer app1y(String s) {
String[] arr = s.split(" -");
String ageString = arr[1];
int age = Integer.parseInt(ageString);
return age;
}
}).forEach(s -> System.out.println(s));
//简化
list.stream().map(s ->Integer.parseInt(s.split("-")[1])).forEach(s -> System.out.println(s));
终结方法
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");
// toArray()收集流中的数据,放到数组中 不指定默认ob类型
Object[] arr1 = list.stream().toArray();
System.out.println(Arrays.toString(arr1));
//IntFunction的泛型:具体类型的数组
//apply的形参:流中数据的个数,要跟数组的长度保持一致
//apply的返回值:具体类型的数组
//方法体:就是创建数组
//toArray方法的参数的作用:负责创建一个指定类型的数组
//toArray方法的底层,会依次得到流里面的每一个 数据,并把数据放到数组当中
//toArray方法的返回值:是一个装着流里面所有数据的数组
String[] arr = list.stream().toArray(new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
return new String[value];
}
});
System.out.println(Arrays.toString(arr));
String[] arr2 = list.stream().toArray(value -> new String[value]);
System.out.println(Arrays.toString(arr2));
收集方法
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张无忌-男-15", "周芷若-女-14", "赵敏-女-13", "张强-男-20",
"张三丰-男-100", "张翠山-男-40", "张良-男-35", "王二麻子-男-37", "谢广坤-男-41");
//收集Map集合当中
//要把所有的男性收集起来
//键:姓名。值:年龄
/*toMap : 参数一表示键的生成规则
参数二表示值的生成规则
参数一:
Function泛型一:表示流中每一个数据的类型
泛型二:表示Map集合中键的数据类型