JavaSe—Stream流☆

目录

1、认识Stream流

stream流的使用步骤

2、步骤1:获取stream流

3、步骤2:Stream流常用的方法

4、步骤3:Stream流的终极方法

5、收集Stream流


1、认识Stream流

  • streamjdk8开始新增的一套API(java.util.stream.*),可以用于操作集合或者数组的数据。

一些集合或者数组都有相应的方法进行操作数据为什么还要使用stream流呢?stream有什么优势呢?

  • 优势:Stream流大量的结合了Lambda的语法风格编程,功能强大,性能高效,代码简洁,可读性好。

体验Stream流

上面需求的代码实现,使用了传统的方法和Stream流两种方法:

java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Demo3Stream {
    public static void main(String[] args) {
        //目标:认识stream 流,掌握stream 的基本使用,体会它的好处
        List<String> list = new ArrayList<>();  //创建数组列表
        list.add("张三");
        list.add("张三丰");
        list.add("熊大");
        list.add("赵敏");
        list.add("张无忌");
        list.add("张翠山");
        list.add("光头强");
        list.add("小龙女");
        //1、现在要将所有以张开头且3字符的元素,存储到一个新集合
        //方式1、使用传统方案
        //startsWith 判断字符串开头前缀
        List<String> list2 = new ArrayList<>();
        for (String s : list) {
            if(s.startsWith("张") && s.length() == 3){
                list2.add(s);
            }
        }
        System.out.println(list2);

        //方式2、使用 stream流
        System.out.println(list.stream().filter(s -> s.startsWith("张")).
                filter(s -> s.length() == 3).collect(Collectors.toList()));
    }
}
/*
[张三丰, 张无忌, 张翠山]
[张三丰, 张无忌, 张翠山]
 */

stream流的使用步骤

2、步骤1:获取stream流

  • 获取集合的stream流。
java 复制代码
import java.util.*;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class StreamDemo2 {
    public static void main(String[] args) { 
        //获取stream流
        //1、获取集合的stream流
        Collection<String> list = new ArrayList<>();
        Stream<String> streamList =list.stream(); //获取集合的stream流
        
        //2、获取Map集合的stream流
        Map<String, String> map = new HashMap<>();
        //map.stream(); //报错
        
        //获得Map集合键的stream流
        Stream<String> keyStream= map.keySet().stream();
        
        //获取Map值的stream流
        Stream<String > valuesStream =  map.values().stream();
        
        //获取键值对的stream流
        Stream<Map.Entry<String, String>> EntryStream = map.entrySet().stream();
        
        //3、获取数数组的stream流
        String[] arr = {"张三", "李四", "王五"};
        //方法1、
        Stream<String> streamArr = Arrays.stream(arr);  //
        //方法2、
        Stream<String> streamArr2 = Stream.of(arr);
        Stream<String> streamArr3 = Stream.of("张三", "李四", "王五"); //这里可以传入多个参数
    }
}

3、步骤2:Stream流常用的方法

java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class Demo4Stream {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("熊大");
        list.add("张三丰");
        list.add("张无忌");
        list.add("张翠山");
        //对流中的数据进行过滤,只保留姓张的
        Stream<String> streamlist = list.stream().filter(s -> s.startsWith("张"));
        streamlist.forEach(System.out::println);
        //sorted 排序对元素进行排序
        List<Double> list2 = new ArrayList<>();
        list2.add(4.1);
        list2.add(2.1);
        list2.add(3.1);
        list2.add(1.1);
        list2.add(1.1);
        list2.add(1.1);
        System.out.println("------------------------------排序------------------------------");
        Stream<Double> streamsorted = list2.stream().sorted();
        streamsorted.forEach(System.out::println); //1.1 2.1 3.1 4.1
        System.out.println("---------------------------------自定义排序---------------------------------");
        Stream<Double> stream2 = list2.stream().sorted((d1,d2)->d2.compareTo(d1));
        stream2.forEach(System.out::println);
        System.out.println("------------------------------------------谋取前几个元素------------------------------------------------");
        Stream<Double> stream3 = list2.stream().sorted().limit(2);
        stream3.forEach(System.out::println);
        System.out.println("------------------------------------------------------跳过前几个元素---------------------------------------------------------------");
        Stream<Double> stream4 = list2.stream().sorted().skip(2);
        stream4.forEach(System.out::println);
        System.out.println("_______________________去重____________________");
        Stream<Double> stream5 = list2.stream().distinct();
        stream5.forEach(System.out::println);
        System.out.println("_____________________映射_____________________");
        Stream<Double> stream6 = list2.stream().map(d -> d * 2).distinct();
        stream6.forEach(System.out::println);
        System.out.println("_____________________合并_____________________");
        Stream<Double> stream7 = Stream.of(1.1,2.2,3.3);
        Stream<Double> stream8 = Stream.of(4.4,5.5,6.6);
        Stream<Double> stream9 = Stream.concat(stream7,stream8);
        stream9.forEach(System.out::println);
    }
}
/*
张三丰
张无忌
张翠山
------------------------------排序------------------------------
1.1
1.1
1.1
2.1
3.1
4.1
---------------------------------自定义排序---------------------------------
4.1
3.1
2.1
1.1
1.1
1.1
------------------------------------------谋取前几个元素------------------------------------------------
1.1
1.1
------------------------------------------------------跳过前几个元素---------------------------------------------------------------
1.1
2.1
3.1
4.1
_______________________去重____________________
4.1
2.1
3.1
1.1
_____________________映射_____________________
8.2
4.2
6.2
2.2
_____________________合并_____________________
1.1
2.2
3.3
4.4
5.5
6.6
 */

4、步骤3:Stream流的终极方法

  • 终结方法指的是调用完成后,不会返回新的Stream流了,没法继续使流了。
java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class Demo5Stream {
    public static void main(String[] args) {
        List<Teacher> list = new ArrayList<>();
        list.add(new Teacher("张三", 18, 5000));
        list.add(new Teacher("张三丰", 50, 5006));
        list.add(new Teacher("张无忌", 20, 66008));
        list.add(new Teacher("张翠山", 30, 4000));
        list.add(new Teacher("赵敏", 18, 15000));

        list.stream().filter(t -> t.getSalary() > 10000).forEach(System.out::println);
        System.out.println("-----------------");
        long count = list.stream().count();
        System.out.println(count);
        System.out.println("-----------------");
        Optional<Teacher>max = list.stream().max((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
        System.out.println(max.get()); //输出最大值对象
        System.out.println("-----------------");
        Optional<Teacher>min = list.stream().min((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
        System.out.println(min.get());
    }
}
    /*
    Teacher{name='张无忌', age=20, salary=66008.0}
Teacher{name='赵敏', age=18, salary=15000.0}
-----------------
5
-----------------
Teacher{name='张无忌', age=20, salary=66008.0}
-----------------
Teacher{name='张翠山', age=30, salary=4000.0}
     */

5、收集Stream流

  • 收集Stream流:就是把Stream流操作后的结果传回到集合或者数组去返回。
  • Stream流:方便操作集合/数组的手段
  • 集合/数组:才是开发中的目的
java 复制代码
import java.util.*;
import java.util.stream.Collectors;

public class Demo6Stream {
    public static void main(String[] args) {
        //一个流只能收集一次
        System.out.println("--------------收集到List集合---------------------");
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张三丰");
        list.add("张无忌");
        list.add("熊大");
        list.add("赵敏");
        //把流收集到List集合
        List<String> li = list.stream().collect(Collectors.toList());
        li.forEach(System.out::println);
        System.out.println("--------------收集到Set集合---------------------");
        List<String> list1 = new ArrayList<>();
        list1.add("张三");
        list1.add("张三丰");
        list1.add("张无忌");
        list1.add("熊大");
        list1.add("赵敏");
        //把流收集到Set集合
        Set<String> set = list1.stream().collect(Collectors.toSet());
        System.out.println( set);
        System.out.println("--------------收集到Map集合---------------------");
        //把流收集到Map集合
        List<Teacher1> list2 = new ArrayList<>();
        list2.add(new Teacher1("张三", 5000));
        list2.add(new Teacher1("张三丰", 5006));
        list2.add(new Teacher1("张无忌", 15008));
//        Map<String, Double> map = list2.stream().collect(Collectors.toMap(new Function<Teacher1, String>() {
//            @Override
//            public String apply(Teacher1 teacher1) {
//                return teacher1.getName();
//            }
//        }, new Function<Teacher1, Double>() {
//            @Override
//            public Double apply(Teacher1 teacher1) {
//                return teacher1.getSalary();
//            }
//        }));

        //优化
        Map<String, Double> map = list2.stream().collect(Collectors.toMap(Teacher1::getName, Teacher1::getSalary));
        System.out.println( map);
        System.out.println("--------------收集到数组---------------------");
        List<String> list3 = new ArrayList<>();
        list3.add("张三");
        list3.add("张三丰");
        list3.add("张无忌");
        list3.add("熊大");
        list3.add("赵敏");
        Object[] arr = list3.stream().toArray();
        System.out.println(Arrays.toString(arr));
    }
}
/*
--------------收集到List集合---------------------
张三
张三丰
张无忌
熊大
赵敏
--------------收集到Set集合---------------------
[张三, 熊大, 张三丰, 赵敏, 张无忌]
--------------收集到Map集合---------------------
{张三=5000.0, 张三丰=5006.0, 张无忌=15008.0}
--------------收集到数组---------------------
[张三, 张三丰, 张无忌, 熊大, 赵敏]
 */
相关推荐
郝开2 小时前
最终 2.x 系列版本)2 - 框架搭建:pom配置;多环境配置文件配置;多环境数据源配置;测试 / 生产多环境数据源配置
java·spring boot·后端
Js_cold2 小时前
(* clock_buffer_type=“NONE“ *)
开发语言·fpga开发·verilog·vivado·buffer·clock
Homeey2 小时前
深入理解ThreadLocal:从原理到架构实践的全面解析
java·后端
ANGLAL2 小时前
27.短链系统
java
周杰伦_Jay2 小时前
【Go微服务框架深度对比】Kratos、Go-Zero、Go-Micro、GoFrame、Sponge五大框架
开发语言·微服务·golang
杰瑞哥哥2 小时前
标准 Python 项目结构
开发语言·python
shykevin2 小时前
Rust入门
开发语言·后端·rust
QT 小鲜肉3 小时前
【个人成长笔记】将Try Ubuntu里面配置好的文件系统克隆在U盘上(创建一个带有持久化功能的Ubuntu Live USB系统)
linux·开发语言·数据库·笔记·ubuntu
Lisonseekpan3 小时前
Git 命令大全:从基础到高级操作
java·git·后端·github·团队开发