首页 > 编程语言 >java--Stream流基础

java--Stream流基础

时间:2022-11-06 23:35:10浏览次数:25  
标签:java Stream stream -- ArrayList list add public

Stream流操作方法

执行完此方法之后,Stream流依然可以继续执行其他操作

Stream流的思想

 

Stream流的三类方法

  获取Stream流

    好比创建一条流水线,并把数据放到流水线上进行操作。

  中间方法

    流水线上的操作, 一次操作完毕之后,还可以继续进行其他操作

  终结方法

    一个Stream流只能有一个终止方法,是流水线上的最后一个操作

  生成Stream流的方式

  Collection体系集合

   使用默认方法stream()生成流, default Stream stream()

  Map体系集合

    把Map转成Set集合,间接的生成流

  数组

    通过Arrays中的静态方法stream生成流

    同种数据类型的多个数据

    通过Stream接口的静态方法of(T... values)生成流

 常见方法

方法名 说明
Stream<T> filter(Predicate predicate) 用于对流中的数据进行过滤
Stream<T> limit(long maxSize) 返回此流中的元素组成的流,截取前指定参数个数的数据
Stream<T> skip(long n) 跳过指定参数个数的数据,返回由该流的剩余元素组成的流
static <T> Stream<T> concat(Stream a, Stream b) 合并a和b两个流为一个流
Stream<T> distinct() 返回由该流的不同元素(根据Object.equals(Object) )组成的流

 代码实例:

public class StreamDemo {
    public static void main(String[] args) {
        //Collection体系的集合可以使用默认方法stream()生成流
        List<String> list = new ArrayList<String>();  // 创建一个ArrayList
        Stream<String> listStream = list.stream();   // 将ArrayList加入流

        Set<String> set = new HashSet<String>(); // 上同
        Stream<String> setStream = set.stream();

        //Map体系的集合间接的生成流
        Map<String,Integer> map = new HashMap<String, Integer>();
        Stream<String> keyStream = map.keySet().stream();   // 将获得的键值加入流
        Stream<Integer> valueStream = map.values().stream();  // 将值加入流
        Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();  // 将键值对加入流

        //数组可以通过Arrays中的静态方法stream生成流
        String[] strArray = {"hello","world","java"};  
        Stream<String> strArrayStream = Arrays.stream(strArray);  // 将数组加入流
      
      	//同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流
        Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");// 将相同的类型的元素加入流
        Stream<Integer> intStream = Stream.of(10, 20, 30);// 将相同的类型的元素加入流
    }
}

 代码实例2:

 

public class MyStream {
    public static void main(String[] args) {
//        Stream<T> filter(Predicate predicate):过滤
//        Predicate接口中的方法	boolean test(T t):对给定的参数进行判断,返回一个布尔值

        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张无");
        list.add("张翠山");
        list.add("王二麻子");
        list.add("张飞");
        list.add("谢广坤");

        //filter方法获取流中的 每一个数据.
        //而test方法中的s,就依次表示流中的每一个数据.
        //我们只要在test方法中对s进行判断就可以了.
        //如果判断的结果为true,则当前的数据留下
        //如果判断的结果为false,则当前数据就不要.
        list.stream().filter(           // 匿名内部类,重写接口中的方法
                new Predicate<String>() {
                    @Override
                    public boolean test(String s) {
                        boolean result = s.startsWith("张");
                       return result;
                    }
                }
        ).forEach(s-> System.out.println(s));

        //因为Predicate接口中只有一个抽象方法test
        //所以我们可以使用lambda表达式来简化
        list.stream().filter(
                (String s)->{
                    boolean result = s.startsWith("张");
                        return result;
                }
        ).forEach(s-> System.out.println(s));
// 如果只有一个变量,可以省略变量数据类型和括号,箭头后面如果只有一条语句可以省略return,和花括号,最后加上终止语句即可
        list.stream().filter(s ->s.startsWith("张")).forEach(s-> System.out.println(s));

    }
}

 Stream流终结操作方法

 

  • 概念

    终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作

  • 常见方法

    方法名 说明
    void forEach(Consumer action) 对此流的每个元素执行操作
    long count() 返回此流中的元素数

 

Stream流的收集操作【应用】

  • 概念

    对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中

  • 常用方法

    方法名 说明
    R collect(Collector collector) 把结果收集到集合中
  • 工具类Collectors提供了具体的收集方式

    方法名 说明
    public static <T> Collector toList() 把元素收集到List集合中
    public static <T> Collector toSet() 把元素收集到Set集合中
    public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中

 

// toList和toSet方法演示 
public class MyStream {
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            list1.add(i);
        }

        list1.add(10);
        list1.add(10);
        list1.add(10);
        list1.add(10);
        list1.add(10);

        //filter负责过滤数据的.
        //collect负责收集数据.
                //获取流中剩余的数据,但是他不负责创建容器,也不负责把数据添加到容器中.
        //Collectors.toList() : 在底层会创建一个List集合.并把所有的数据添加到List集合中.
        List<Integer> list = list1.stream().filter(number -> number % 2 == 0)
                .collect(Collectors.toList());

        System.out.println(list);

        Set<Integer> set = list1.stream().filter(number -> number % 2 == 0)
            .collect(Collectors.toSet());
        System.out.println(set);
}
}
/**
Stream流的收集方法 toMap方法演示
创建一个ArrayList集合,并添加以下字符串。字符串中前面是姓名,后面是年龄
"zhangsan,23"
"lisi,24"
"wangwu,25"
保留年龄大于等于24岁的人,并将结果收集到Map集合中,姓名为键,年龄为值
*/
public class MyStream {
	public static void main(String[] args) {
      	ArrayList<String> list = new ArrayList<>();
        list.add("zhangsan,23");
        list.add("lisi,24");
        list.add("wangwu,25");

        Map<String, Integer> map = list.stream().filter(
                s -> {
                    String[] split = s.split(",");
                    int age = Integer.parseInt(split[1]);
                    return age >= 24;
                }

         //   collect方法只能获取到流中剩余的每一个数据.
         //在底层不能创建容器,也不能把数据添加到容器当中

         //Collectors.toMap 创建一个map集合并将数据添加到集合当中

          // s 依次表示流中的每一个数据

          //第一个lambda表达式就是如何获取到Map中的键
          //第二个lambda表达式就是如何获取Map中的值
        ).collect(Collectors.toMap(
                s -> s.split(",")[0], // 切片
                s -> Integer.parseInt(s.split(",")[1]) ));

        System.out.println(map);
	}
}

 Stream流综合练习【应用】

  • 案例需求

    现在有两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下的操作

    • 男演员只要名字为3个字的前三人

    • 女演员只要姓林的,并且不要第一个

    • 把过滤后的男演员姓名和女演员姓名合并到一起

    • 把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据

    演员类Actor已经提供,里面有一个成员变量,一个带参构造方法,以及成员变量对应的get/set方法

 

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;
    }
}
public class StreamTest {
    public static void main(String[] args) {
        //创建集合
        ArrayList<String> manList = new ArrayList<String>();
        manList.add("周润发");
        manList.add("成龙");
        manList.add("刘铁柱");
        manList.add("吴京");
        manList.add("周星驰");
        manList.add("李连杰");
  
        ArrayList<String> womanList = new ArrayList<String>();
        womanList.add("林心如");
        womanList.add("张曼玉");
        womanList.add("林青霞");
        womanList.add("柳岩");
        womanList.add("林志玲");
        womanList.add("王祖贤");
  
        //男演员只要名字为3个字的前三人
        Stream<String> manStream = manList.stream().filter(s -> s.length() == 3).limit(3);
  
        //女演员只要姓林的,并且不要第一个
        Stream<String> womanStream = womanList.stream().filter(s -> s.startsWith("林")).skip(1);
  
        //把过滤后的男演员姓名和女演员姓名合并到一起
        Stream<String> stream = Stream.concat(manStream, womanStream);
  
      	// 将流中的数据封装成Actor对象之后打印
      	stream.forEach(name -> {
            Actor actor = new Actor(name);
            System.out.println(actor);
        }); 
    }
}

标签:java,Stream,stream,--,ArrayList,list,add,public
From: https://www.cnblogs.com/e-link/p/16864625.html

相关文章

  • vue $nextTick方法
    $nextTick方法问题:异步代码没有执行,但是同步代码已经完成逻辑,所以就需要使用$nextTick来等待dom完毕后再执行同步代码解决方法:使用nextTick()等待dom更新完毕后,在......
  • .net core在centos上使用libgdiplus库图像处理
    #Seehttps://aka.ms/containerfastmodetounderstandhowVisualStudiousesthisDockerfiletobuildyourimagesforfasterdebugging.FROMmcr.microsoft.com/......
  • Servlet生命周期
    1.执行Servlet构造方法2.执行init初始化方法第一、二步是在第一次访问的时候创建Servlet程序会调用3.执行service方法第三步每次访问都会调用4.执行destroy销毁方法......
  • 学习python-Day83
    昨日回顾1.vue项目目录----》vue项目编译----》html,css,jspublic:index.html 单页面应用src:以后写代码,都在这里assetscomponentrouterstore:vuex----》状态管......
  • 论文笔记 - Coresets for Data-efficient Training of Machine Learning Models
    Motivation训练深度网络存在的问题:需要大量训练数据,进而需要更强的计算资源等。因此如何在减少这些开销(例如使用更小的数据集)的同时,不影响模型的性能成为了一个至关重要......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验......
  • 学习python-Day84
    今日学习内容补充:关于环境变量的问题1.相对导入和绝对导入1.相对导入必须从环境变量下开始到sys.path 如果包找不到错误,确认环境变量。2.绝对导入,以当前文件为基准......
  • 逆向工程-代码生成器
    packagecom.atguigu.demo;importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.ge......
  • java 集合
    packagecom.tedu.day1302;importjava.util.ArrayList;importjava.util.Collection;publicclassStudy_Collection{publicstaticvoidmain(String[]args)......
  • git学习之通俗易懂篇(九)【查看历史版本的各种方式】
    1、gitlog--oneline   【在一行上展示每一次提交】看得更清楚些~2、gitlog--oneline--graph   【看到变化过程】tips:(1)如果commit的次数比较多,就会......