Java Stream流

1.作用:是java8中处理集合的关键抽象概念,将集合中的数据变成另一种流的形式,可以对集合进行复杂的操作。Stream(流) 类用于来简化集合类的使用,Stream 本质上是个接口,接口中定义了很多对 Stream 对象的操作;

2.获取Strean流对象:

可以根据集合获取流对象

Collection集合:

default Stream<E> stream(); 返回的是一个有顺序的 和集合源数据相关的对象

2.11.根据list集合获取流对象

package com.wl.a_stream;
import java.util.ArrayList;
import java.util.List;
//根据list集合获取流对象
public class Demo03 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("牛彩云");
        list.add("荆二条");
        list.add("荆二条");
        list.add("荆二胖");
        list.stream().forEach((name)-> System.out.println(name));
    }
}

2.2根据set集合获取流对象

package com.wl.a_stream;
import java.util.HashSet;
import java.util.Set;
//根据set集合获取流对象
public class Demo04 {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("牛彩云");
        set.add("荆二条");
        set.add("荆二条");
        set.add("荆二胖");
        set.stream().forEach((name)-> System.out.println(name));
    }
}

2.3根据map集合获取对象

package com.wl.a_stream;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
public class Demo05 {
    public static void main(String[] args) {
        Map<String , String> map = new HashMap<>();
        map.put("1","啤酒鸭");
        map.put("2","烤全鸭");
        map.put("3","脆皮鸭");
        //map集合没有stream方法,转为集合再来操作
        Set<String> strings = map.keySet();//获取键放到set集合中
        Stream<String> stream = strings.stream();//将set集合中的键变成流
        Collection<String> values = map.values();//获取值放到Collection集合中
        Stream<String> stream1 = values.stream();//将获取的值转为流

        Set<Map.Entry<String, String>> entries = map.entrySet();//将获取的键值对放到集合中
        Stream<Map.Entry<String, String>> stream2 = entries.stream();//将获取的键值对集合转为stream流

    }
}

2.4数组

String[] arr = {"依依" , "思思" , "毵毵"};
Stream<String> arr1 = Stream.of(arr);
arr1.forEach((name)-> System.out.println(name));

3.Stream流对象下面的方法

方法名字方法作用方法种类是否支持链式操作
count统计个数终结方法
forEach遍历数据的终结方法
filter过滤数据可以拼接
limit取前几个数据可以拼接
skip跳过前几个可以拼接
map映射方法可以拼接
concat拼接可以拼接

4. count 和 forEach

count: 统计流中的个数,返回值是long类型的数据

forEach : 遍历流中的数据

package com.wl.b_stream;
import java.util.ArrayList;
public class Demo01 {
    public static void main(String[] args) {
        ArrayList<String> arr = new ArrayList<>();
        arr.add("胡歌");
        arr.add("李逍遥");
        arr.add("宇文拓");
        arr.add("古月胡");
        //链式操作 count()统计流中的个数
        long count = arr.stream().count();
        System.out.println(count);//4
        System.out.println(arr.stream().count());//4
        //forEach遍历流中的数据
        arr.stream().forEach((name)-> System.out.println(name));
    }
}

4.1filter方法

Stream<T> filter(Predicate<? super T> predicate)

返回由于此给定谓词匹配的此流的元素组成的流

package com.wl.b_stream;

import java.util.ArrayList;
//filter方法 过滤
public class Demo02 {
    public static void main(String[] args) {
        ArrayList<String> arr = new ArrayList<>();
        arr.add("胡歌");
        arr.add("李逍遥");
        arr.add("李遥");
        arr.add("宇文拓");
        arr.add("古月胡");
        arr.stream().filter((name)->name.startsWith("李")).
                filter((name)->name.endsWith("遥")).forEach((name)-> System.out.println(name));
    }
}

4.2limit方法

限制输出

package com.wl.b_stream;
import java.util.ArrayList;
//limit方法 限制输出
public class Demo03 {
    public static void main(String[] args) {
        ArrayList<String> arr = new ArrayList<>();
        arr.add("胡歌");
        arr.add("李逍遥");
        arr.add("李遥");
        arr.add("宇文遥");
        arr.add("古月遥");
        arr.add("古遥");
        arr.add("月遥");
        arr.add("古遥遥");
        arr.stream().limit(4).filter((name)->name.
                endsWith("遥")).forEach((name)-> System.out.println(name));
    }
}

4.3map方法

处理映射关系

package com.wl.b_stream;
//map方法 处理映射关系
import java.util.ArrayList;
import java.util.function.Function;
public class Demo04 {
    public static void main(String[] args) {
        ArrayList<String> arr = new ArrayList<>();
        arr.add("12");
        arr.add("13");
        arr.add("14");
        arr.add("15");
        arr.add("16");
       /* //将字符串数值转为int数据类型
        for (String s : arr) {
            int i = Integer.parseInt(s);
            System.out.println(i);
        }*/
        arr.stream().map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                int i = Integer.parseInt(s);
                return i;
            }
            //.parseInt() 转int数据的方法
        }).forEach((Integer s)-> System.out.println(s));
        System.out.println("==============");
        //链式
        arr.stream().map((name)->Integer.parseInt(name)).
                forEach((name)-> System.out.println(name));
    }
}

4.4skip方法

跳过前几个值

import java.util.ArrayList;
//skip方法
public class Demo05 {
    public static void main(String[] args) {
        ArrayList<String> arr2 = new ArrayList<>();
        arr2.add("胡歌");
        arr2.add("李逍遥");
        arr2.add("李遥");
        arr2.add("宇文遥");
        arr2.add("古月遥");
        arr2.add("古遥");
        arr2.add("月遥");
        arr2.stream().skip(4).filter((name)->name.endsWith("遥")).
                forEach((name)-> System.out.println(name));
    }
}

4.5concat合并两个流

package com.wl.b_stream;
import java.util.ArrayList;
import java.util.stream.Stream;
// concat合并两个流
public class Demo06 {
    public static void main(String[] args) {
        ArrayList<String> arr = new ArrayList<>();
        arr.add("12");
        arr.add("13");
        arr.add("14");
        arr.add("15");
        arr.add("16");
        ArrayList<String> arr2 = new ArrayList<>();
        arr2.add("胡歌");
        arr2.add("李逍遥");
        arr2.add("李遥");
        arr2.add("宇文遥");
        //将两个集合转为stream流
        Stream<String> stream = arr.stream();
        Stream<String> stream1 = arr2.stream();
        //将两个流合并 concat  
        Stream<String> concat = Stream.concat(stream, stream1);
        //forEach 遍历打印
        concat.forEach((name)-> System.out.println(name));
    }
}

5.收集流

stream.collect(Collectors.toList())

stream.collect(Collectors.toSet())

toList(); 将流转为List集合

toSet(); 将流转为Set集合

因为真实的开发的时候,最终的结果还是集合 流只是扮演了中间处理数据的角色,中转站

package com.wl.b_stream;
import java.util.ArrayList;
import java.util.stream.Collectors;
public class Demo07 {
    public static void main(String[] args) {
        ArrayList<String> arr = new ArrayList<>();
        arr.add("胡歌");
        arr.add("李逍遥");
        arr.add("李遥");
        arr.add("宇文遥");
        arr.add("古月遥");
        arr.add("古遥");
        arr.add("古遥");
        arr.add("月遥");
        arr.add("古遥遥");
        arr.stream().skip(4).filter((name)->name.endsWith("遥")).
                collect(Collectors.toList()).forEach((name)-> System.out.println(name));
        System.out.println("==================");
        arr.stream().skip(4).filter((name)->name.endsWith("遥")).
                collect(Collectors.toSet()).forEach((name)-> System.out.println(name));
    }
}

练习:

package com.wl.zy_stream;
import java.util.ArrayList;
import java.util.stream.Stream;
/*现在有两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下的操作:
        1:男演员只要名字为3个字的前三人
        2:女演员只要姓林的,并且不要第一个
        3:把过滤后的男演员姓名和女演员姓名合并到一起
        4:把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
        https://yebd1h.smartapps.cn/pages/blog/index?blogId=117229163&_swebfr=1&_swebFromHost=baiduboxapp*/
class Actor{
    private String name;

    public Actor(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Actor{" +
                "name='" + name + '\'' +
                '}';
    }
}
public class Work01 {
    public static void main(String[] args) {
        //第一个ArrayList集合 存储6名男演员
        ArrayList<String> arr = new ArrayList<>();
        arr.add("胡歌");
        arr.add("隋炀帝");
        arr.add("秦始皇");
        arr.add("倪大红");
        arr.add("张凯");
        arr.add("霍建华");
        //第二个ArrayList集合 存储6名女演员
        ArrayList<String> arr1 = new ArrayList<>();
        arr1.add("刘亦菲");
        arr1.add("林黛玉");
        arr1.add("林心如");
        arr1.add("李知恩");
        arr1.add("黄荣");
        arr1.add("林允儿");
        //1.男演员只要名字为3个字的前三人
        Stream<String> manStr = arr.stream().filter((name)->name.length() == 3).
                limit(3);
      //  manStr.forEach((name)-> System.out.println(name));
        System.out.println("================");
        //2.女演员只要姓林的,并且不要第一个
        Stream<String> womanStr = arr1.stream().filter((name1)->name1.startsWith("林")).
                skip(1);
       // womanStr.forEach((name)-> System.out.println(name));
        System.out.println("==============");
        //3:把过滤后的男演员姓名和女演员姓名合并到一起
        Stream<String> stream = Stream.concat(manStr, womanStr);
        //stream.forEach(System.out::println);//==> stream.forEach((name)-> System.out.println(name));
        //4:把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
        //想输出 需要把上面的 终结方法注释掉(forEach等)
        stream.map(Actor::new).forEach(System.out::println);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值