Stream流复习2021092

Stream流

用传统方式过滤

  1. 过滤姓张的
  2. 过滤长度为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 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集合中

posted @ 2021-09-12 20:13  正在努力的澎澎  阅读(55)  评论(0)    收藏  举报