Stream流复习2021092
Stream流
用传统方式过滤
- 过滤姓张的
- 过滤长度为3的
public class MySet2 {
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
list1.add("张无忌");
list1.add("张天爱");
list1.add("张三丰");
list1.add("张田");
list1.add("范冰冰");
list1.add("房东的猫");
list1.add("李荣浩");
//遍历list1把以张开头的放到list2中
ArrayList<String> list2 = new ArrayList<>();
for (String s : list1) {
if (s.startsWith("张")){
list2.add(s);
}
}
//将姓名长度为3的放到list3中
ArrayList<String> list3 = new ArrayList<>();
for (String s : list2) {
if (s.length() == 3){
list3.add(s);
}
}
System.out.println(list1);
System.out.println(list2);
System.out.println(list3);
}
}
//结果
list1:[张无忌, 张天爱, 张三丰, 张田, 范冰冰, 房东的猫, 李荣浩]
list2:[张无忌, 张天爱, 张三丰, 张田]
list3:[张无忌, 张天爱, 张三丰]
用stream流实现
List<String> result = list1.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).collect(Collectors.toList());
System.out.println(result);
//[张无忌, 张天爱, 张三丰]
一行搞定!
Stream流思想
相当于流水线

获取方法
-
获取stream流
创建一条流水线,并把数据放到流水线上准备进行操作
只有以下情况下才能使用Stream流
单列集合
可以使用Collection接口中的默认方法stream生成流
default Stream
ArrayList<String> list1 = new ArrayList<>();
list1.add("张无忌");
list1.add("张天爱");
list1.add("张三丰");
list1.add("张田");
list1.add("范冰冰");
list1.add("房东的猫");
list1.add("李荣浩");
List<String> result = list1.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).collect(Collectors.toList());
System.out.println(result);
双列集合
间接生成流
可以先通过keySet或者EntrySet获取一个set集合,再获取stream流
public class TestMap {
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
map.put("张三","23");
map.put("李四","24");
map.put("王五","25");
map.put("赵六","26");
//双列集合不能直接获取流
//1.通过keySet
Set<String> keys = map.keySet();
keys.stream().forEach(s -> System.out.println(s));
//通过EntrySet
map.entrySet().stream().forEach(s -> System.out.println(s));
}
}
//结果
李四
张三
王五
赵六
李四=24
张三=23
王五=25
赵六=26
数组
Arrays中的静态方法stream生成流
int [] arr = {1,2,3,4,5,6};
Arrays.stream(arr).forEach(s -> System.out.println(s));
//1 2 3 4 5 6
同种数据类型的多个数据
使用Stream.of(T...value)生成流
Stream.of(1,2,3,4,5,6,7,8).forEach(
num -> System.out.println(num)
);
中间方法
-
中间方法
流水线上的操作,一次操作完毕后,还可以继续进行其他操作
filter

public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
list1.add("张无忌");
list1.add("张天爱");
list1.add("张三丰");
list1.add("张田");
list1.add("范冰冰");
list1.add("房东的猫");
list1.add("李荣浩");
//filter方法获取流中的每一个数据
//而test方法中的s,就依次表示流中的每一个数据
//我们只要在test方法中对s进行判断就可以了
//如果判断的结果为true,则当前的数据留下,为false当前数据不要
list1.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
boolean result = s.startsWith("张");
return result;
}
}).forEach(s -> System.out.println(s));
}
limit
截取指定参数个数的数据
如果流中有7个数据,limit(3)就是截取前三个
ArrayList<String> list1 = new ArrayList<>();
list1.add("张无忌");
list1.add("张天爱");
list1.add("张三丰");
list1.add("张田");
list1.add("范冰冰");
list1.add("房东的猫");
list1.add("李荣浩");
List<String> lists = list1.stream().limit(3).collect(Collectors.toList());
System.out.println(lists);
//结果
[张无忌, 张天爱, 张三丰]
skip
跳过指定参数的个数
skip(5)表示前面五个不要了,截取剩余的
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
list1.add("张无忌");
list1.add("张天爱");
list1.add("张三丰");
list1.add("张田");
list1.add("范冰冰");
list1.add("房东的猫");
list1.add("李荣浩");
List<String> collect = list1.stream().skip(3).collect(Collectors.toList());
System.out.println(collect);
}
//结果
[张田, 范冰冰, 房东的猫, 李荣浩]
concat(Stream a,Stream b)
合并a和b两个流为一个流
ArrayList<String> list1 = new ArrayList<>();
list1.add("张无忌");
list1.add("张天爱");
list1.add("张三丰");
list1.add("张田");
list1.add("范冰冰");
list1.add("房东的猫");
list1.add("李荣浩");
ArrayList<String> list2 = new ArrayList<>();
list2.add("张三");
list2.add("李四");
list2.add("王麻子");
Stream<String> stream1 = list1.stream();
Stream<String> stream2 = list2.stream();
Stream<String> stream = Stream.concat(stream1, stream2);
List<String> result = stream.collect(Collectors.toList());
System.out.println(result);
//结果
[张无忌, 张天爱, 张三丰, 张田, 范冰冰, 房东的猫, 李荣浩, 张三, 李四, 王麻子]
distinct
去除流中重复的元素,依赖hashCode和equals方法
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
list1.add("张无忌");
list1.add("张天爱");
list1.add("张三丰");
list1.add("张田");
list1.add("范冰冰");
list1.add("房东的猫");
list1.add("李荣浩");
list1.add("李荣浩");
list1.add("李荣浩");
list1.add("李荣浩");
list1.add("李荣浩");
List<String> result = list1.stream().distinct().collect(Collectors.toList());
System.out.println(result);
}
//结果
[张无忌, 张天爱, 张三丰, 张田, 范冰冰, 房东的猫, 李荣浩]
终结方法
-
终结方法
stream流只能有一个终结方法,是流水线上的最后一个操作

在Srteam流中无法直接修改集合,数组等数据源中的数据
收集操作

List<String> result = list.stream().distinct().collect(Collectors.toList());
Collectors.toList():在底层会创建一个List集合,并把所有数据添加到List集合中
Collectors.toSet():在底层会创建一个Set集合,并把所有数据添加到Set集合中


浙公网安备 33010602011771号