返回顶部
首页 > 资讯 > 精选 >java8新特性Stream怎么创建
  • 364
分享到

java8新特性Stream怎么创建

2023-07-05 12:07:04 364人浏览 独家记忆
摘要

这篇文章主要介绍了java8新特性Stream怎么创建的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java8新特性Stream怎么创建文章都会有所收获,下面我们一起来看看吧。java8除了提供了Lambda表

这篇文章主要介绍了java8新特性Stream怎么创建的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java8新特性Stream怎么创建文章都会有所收获,下面我们一起来看看吧。

java8除了提供了Lambda表达式,操作集合的Stream api也是非常新特性中最值得学习和掌握的,它大大简化了,我们操作数据集合的代码量的书写。

简单来说Stream是一个抽象概念,可以通过查找,过滤,映射等操作,这一点与Scala中集合操作很类似。

Stream是什么?

通俗的说就是操作数据集合的一种手段,你可以使用它,以获取所需要的集合数据源类型,如下图所示:

通常Stream流操作整个流程是创建流对象->对流操作->获得目标数据源操作

java8新特性Stream怎么创建

创建Stream

通过Collection接口提供的Stream

返回一个顺序流

default Stream<E> stream() {   return StreamSupport.stream(spliterator(), false); }

返回一个并行流

default Stream<E> parallelStream() {  return StreamSupport.stream(spliterator(), true);}

那我们简单演示一下这两个流的使用。

Emplyee的基本实体类

package com.codegeek.lambda;import lombok.*;@Setter@Getter@NoArgsConstructor@ToStringpublic class Employee {        private String name;        private int age;        private double basicSalary;        private double dealTotalPrice;    public Employee(String name, int age, double basicSalary,double dealTotalPrice) {        this.name = name;        this.age = age;        this.basicSalary = basicSalary;        this.dealTotalPrice = dealTotalPrice;    }        public Double getTotalSalary() {        return this.basicSalary + this.dealTotalPrice * 0.04;    }}

测试方法如下:

 @Test public void test() {Employee qingLong = new Employee("青龙", 25, 5500, 7500);Employee baiHu = new Employee("白虎", 27, 5000, 9000);Employee zhuQue = new Employee("朱雀", 22, 3800, 4500);Employee xuanWu = new Employee("玄武", 24, 3300, 3300);List<Employee> employees = Arrays.asList(qingLong, baiHu, zhuQue, xuanWu);// 得到一个顺序流,并获取工资大与4000的员工的姓名Stream<Employee> stream = employees.stream();    stream.filter(e-> e.getTotalSalary()>4000).map(Employee::getName).forEach(System.out::println);     // 得到一个并行流,获取年龄大于25的员工姓名    Stream<Employee> employeeStream = employees.parallelStream();    employeeStream.filter(employee -> employee.getAge()> 25).map(Employee::getName).forEach(System.out::println ); }

通过Arrays创建Stream流

注意数组里面是什么类型的数组,就会产生同类型的流。

产生IntStream

public static IntStream stream(int[] array) {   return stream(array, 0, array.length);}

产生LongStream

public static LongStream stream(long[] array) { return stream(array, 0, array.length);}

产生DoubleStream

 public static DoubleStream stream(double[] array) {   return stream(array, 0, array.length);}

下面简单演示以下IntStream的使用案列

// 初始化一个数组对象 int[] arr = {11, 55, 44, 20, 45, 16};// 通过Arrays创建流对象是IntStream Arrays.stream(arr).sorted().forEach(System.out::println);

Stream常见的操作

上面简单介绍了下,流的创建,当流创建好后,我们又该如何使用呢,常见流的操作如下?

  • 过滤和切片

方法方法介绍
filter(Predicate<? super T> predicate)接收断言接口,并从流中排除元素
distinct()去除流中重复的元素
limit(long maxSize)截取流中元素个数,类似sql查询limit
skip(long n)跳过元素,跳过前n个元素

使用演示:

@Testpublic void testFilter() {  int[] age = {11, 22, 44, 22, 24, 24, 66, 77, 77, 25, 34};   // 使用filter过滤获得大于33的数组元素  Arrays.stream(age).filter(i -> i > 33).forEach(System.out::println);  // 去重  Arrays.stream(age).distinct().forEach(System.out::println);  // 截取3个元素  Arrays.stream(age).limit(3).forEach(System.out::println);  // 跳过前3个元素  Arrays.stream(age).skip(3).forEach(System.out::println);  }
  • 映射

方法方法介绍
map(Function mapper)接收一个函数式接口,将会映射到流中的每一个元素
mapToDouble(ToDoubleFunction mapper)接收函数式接口,将映射产生DoubleStream
mapToLong(ToLongFunction mapper)接收函数式接口,将映射产生LongStream
mapToInt(ToIntFunction mapper)接收函数式接口,将映射产生IntStream
flatMap(Function extends Stream mapper)接收函数,将流中的每个值都转换一个流,然后将这些流汇成一个流

使用演示:

   String[] arr = {"java", "scala", "PHP", "python", "c++"};   // 将流中的每一个元素转换成大写   Arrays.stream(arr).map(String::toUpperCase).forEach(System.out::println);   //将流中的数据转Double类型    long[] array = {1, 4, 6, 7, 12};   // 返回Double类型的Stream   Arrays.stream(array).mapToDouble(e-> e* 100).forEach(System.out::println);   // 返回Long类型的Stream   Arrays.stream(array).mapToLong(e -> e + 23).forEach(System.out::println);   // flatMap演示  List<List<String>> database = new ArrayList<>();  List<String> noSql = Arrays.asList("redis", "HBase", "membercache");  List<String> sql = Arrays.asList("mysql", "oracle", "db2");  database.add(NoSQL);  database.add(sql);  List<String> h = database.stream().flatMap(s -> s.stream().filter(si -> si.contains("h"))).collect(Collectors.toList());  h.stream().forEach(System.out::println);
  • 排序

  • 排序相对简单,以之前定义的employee类如下:

Employee qingLong = new Employee("青龙", 25, 5500, 7500);Employee baiHu = new Employee("白虎", 27, 5000, 9000);Employee zhuQue = new Employee("朱雀", 22, 3800, 4500);Employee xuanWu = new Employee("玄武", 24, 3300, 3300);List<Employee> employees = Arrays.asList(qingLong, baiHu, zhuQue, xuanWu);// 按照薪水的大小进行排序 employees.stream().sorted(Comparator.comparing(Employee::getTotalSalary)).forEach(System.out::println);
  • 查找与匹配

方法方法介绍
allMatch(Predicate p)检查流中的元素是否都匹配
anyMatch(Predicate p)检查是否匹配一个元素
noneMatch(Predicate p)检查是否没有匹配所有元素
findFirst()返回第一个元素
findAny()返回流中任意元素
count返回流中的个数
max(Comparator c)返回流中最大值
min(Comparator c)返回流中最小值

方法演示:以初始化的员工类

// 判断所有的员工年龄是否大于18boolean b = employees.stream().allMatch(e -> e.getAge() > 18);System.out.println("allMatch="+b);// 结果为true// 判断所有员工中有没有年龄大于35的boolean b1 = employees.stream().anyMatch(e -> e.getAge() > 35);System.out.println("anyMath=" + b1); // 结果为false// 判断所有员工中没有年龄大于35的boolean b1 = employees.stream().noneMatch(e -> e.getAge() > 35);System.out.println("anyMath=" + b1); // 结果为true// 返回第一个员工的信息Optional<Employee> first = employees.stream().findFirst();System.out.println(first.get());// 统计年龄大于20的员工个数ong count = employees.stream().filter(e -> e.getAge() > 20).count();System.out.println("count="+count);// 统计集合中员工薪资最高的员工信息Optional<Employee> max = employees.stream().max(Comparator.comparing(Employee::getTotalSalary));System.out.println("max=" + max);
  • 归约

方法方法介绍
reduce(BinaryOperator p)将流中的元素反复结合起来得到一个值返回Optional
reduce(T iden,BinaryOperator p)将流中的元素反复结合起来得到一个值T

演示:

Optional<Double> reduce = employees.stream().map(Employee::getTotalSalary).reduce(Double::sum);double v = reduce.get();System.out.println("reduce="+v);int[] array = {1, 4, 6, 7, 12};System.out.println("====");// 这里第一次将0作为x的值然后数组中1作为y,然后计算后的结果是1,第二次将1作为x的值,然后数组中的4作为y值进行相加,后面以此类推,直到将所有的值都进行相加int reduce = Arrays.stream(array).reduce(0, (x, y) -> x + y);System.out.println("reduce=" + reduce);
  • 收集

方法方法介绍
collect(Collector c)将流转换为其他形式,接收Collector接口实现。

下面将对Stream做一个总体的回顾和使用。

@Test    public void test() {        // 避免空指针异常        Optional<Employee> optional = employees.stream().sorted((e1, e2) -> e1.getTotalSalary().compareTo(e2.getTotalSalary())).findFirst();        // 若空指针异常就怎么处理        optional.orElse(new Employee());        System.out.println(optional);        // 返回任意一个(并行开启多个线程查找)        Optional<Employee> any = employees.parallelStream().filter((e) -> e.getAge() > 25).findAny();        System.out.println(any);        // Max(Comparator按年龄比较)        Optional<Employee> max = employees.stream().max(Comparator.comparing((e) -> e.getAge()));        System.out.println(max);        Optional<Double> max1 = employees.stream().map(Employee::getTotalSalary().max(Double::compare);        System.out.println(max1.get());        // 流中元素接收,计算得到一个        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);        Integer reduce = list.stream().reduce(0, (x, u) -> x + u);//0+1+2.....+10        System.out.println(reduce);        Optional<Integer> reduce1 = employees.stream().map(Employee::getAge).reduce(Integer::sum);        System.out.println(reduce1.get() + "----------");        // 收集元素到list        employees.stream().map(Employee::getName).distinct().collect(Collectors.toList()).forEach(System.out::println);        System.out.println();        // 收集元素到LinkList        employees.stream().map(Employee::getName).distinct().collect(Collectors.toCollection(HashSet::new)).forEach(System.out::println);        // 获取流中最大值        Optional<Integer> max2 = employees.stream().map(Employee::getAge).max(Integer::compare);        System.out.println(max2.get());        // 收集获取总数(集合总数)        Long collect = employees.stream().collect(Collectors.counting());        System.out.println(collect);        // 工资的平均值        Double collect1 = employees.stream().collect(Collectors.averagingDouble(Employee::getTotalSalary));        System.out.println(collect1);        // 获取工资的总数,综合,最小值,平均值,最大值        DoubleSummaryStatistics collect2 = employees.stream().collect(Collectors.summarizingDouble(Employee::getTotalSalary));        System.out.println(collect2);        // 获取年龄最大的员工        Optional<Employee> collect3 = employees.stream().collect(Collectors.maxBy((e1, e2) -> Integer.compare(e1.getAge(), e2.getAge())));        System.out.println(collect3.get());        // 获取年龄最小的员工        Optional<Double> collect4 = employees.stream().map(Employee::getTotalSalary).collect(Collectors.minBy(Double::compare));        System.out.println(collect4.get());        // 按薪资分组        Map<Double, List<Employee>> collect5 = employees.stream().collect(Collectors.groupingBy(Employee::getTotalSalary));        System.out.println(collect5);        // 薪资分区(匹配true)        Map<Boolean, List<Employee>> collect6 = employees.stream().collect(Collectors.partitioningBy((e) -> e.getTotalSalary() > 5000d));        System.out.println(collect6);    }

关于“java8新特性Stream怎么创建”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“java8新特性Stream怎么创建”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: java8新特性Stream怎么创建

本文链接: https://lsjlt.com/news/351504.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java8新特性Stream怎么创建
    这篇文章主要介绍了java8新特性Stream怎么创建的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java8新特性Stream怎么创建文章都会有所收获,下面我们一起来看看吧。java8除了提供了Lambda表...
    99+
    2023-07-05
  • Java8新特性Stream流怎么使用
    本文小编为大家详细介绍“Java8新特性Stream流怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java8新特性Stream流怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Stream流的概...
    99+
    2023-07-02
  • Java8新特性Stream流详解
    陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油。 本文是介绍Java8新特性Stream流常用方法超详细教学 ...
    99+
    2023-08-17
    java 算法 数据结构
  • Java8新特性之Stream API详解
    目录一、前言二、使用流程三、案例演示一、前言 StreamAPI在Java8版本中使用,关注的是对数据的筛选、查找、存储等 它可以做的事情有:过滤、排序、映射、归约 二、使用流程 S...
    99+
    2024-04-02
  • java8新特性-Stream入门学习心得
    目录Stream是什么?创建StreamStream常见的操作总结上一篇介绍了Lambda的学习,如果对Lambda表达式还不清晰的同学可以戳一下这个链接:java8新特性-lamb...
    99+
    2023-03-13
    java8新特性 Stream入门学习 java8 Stream
  • Java8新特性Stream流的示例分析
    这篇文章主要介绍Java8新特性Stream流的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是Stream流?Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。Stream的优点...
    99+
    2023-05-30
    java8 stream流
  • Java8新特性怎么使用
    本篇内容介绍了“Java8新特性怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java语言新特性Lambda表达式Lambda表达式...
    99+
    2023-06-02
  • 深入理解Java8新特性之Stream API的创建方式和中间操作步骤
    目录1.什么是StreamAPI?2.Stream API操作的三个步骤2.1 创建Stream2.2 中间操作2.2.1 中间操作之筛选与切片2.2.2 中间操作之映射2.2.3 ...
    99+
    2024-04-02
  • Java8中Stream的特性有哪些
    这期内容当中小编将会给大家带来有关Java8中Stream的特性有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.初识stream先来一个总纲:东西就是这么多啦,stream是java8中加入的一个...
    99+
    2023-05-31
    java8 stream ava
  • 带你走进Java8新特性Stream流的小世界
    目录 一. 什么是流(Stream) 1.1 流的定义 1.2 流的特点 1.3 操作流 1.4 创建流 二. 流的中间操作 2.1 流的筛选与切片 2.1.1 filter 2.1.2 limit 2.1.3 skip 2.1.4 dis...
    99+
    2023-09-01
    java 开发语言
  • Java8(JDK1.8)新特性
    一、Java8(JDK1.8)新特性 Lamdba表达式 函数式接口 方法引用和构造引用 Stream API 接口中的默认方法和静态方法 新时间日期API OPtional 其他特性 二、java8(JDK1.8)新特性简介 速度快; 代...
    99+
    2023-09-12
    java
  • java8新特性之stream流中reduce()求和知识总结
    1.stream().reduce()单字段求和 (1)普通数字求和 public static void test2(){ List<Integer&g...
    99+
    2024-04-02
  • Java8新特性详解
    陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油。 本文是介绍Java8新特性与常用方法(此篇只做大体介绍了解,之后会把重...
    99+
    2023-08-17
    java jvm android
  • Java8新特性Optional类怎么应用
    这篇“Java8新特性Optional类怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java8新特性Optiona...
    99+
    2023-06-29
  • java8新特性之stream流中reduce()求和知识有哪些
    这篇文章主要介绍了java8新特性之stream流中reduce()求和知识有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.stream().reduce()单字段求...
    99+
    2023-06-15
  • 熟练掌握Java8新特性之Stream API的全面应用
    1.写在前面 关于Stream API的内容,已经基本上说完了。大家可以参考我的这两篇文章: 深入理解Java8新特性之Stream API的创建方式和中间操作步骤、深入理解Java...
    99+
    2024-04-02
  • Java8并发新特性CompletableFuture
    目录1.CompletableFuture是什么?2.CompletableFuture的方法使用说明2.1 CompletableFuture类提供几个静态方法来进行异步操作2.2...
    99+
    2024-04-02
  • Java8并发新特性CompletableFuture怎么使用
    这篇文章主要介绍“Java8并发新特性CompletableFuture怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java8并发新特性CompletableFuture怎么使用”文章能帮...
    99+
    2023-06-30
  • 深入理解Java8新特性之Stream API的终止操作步骤
    目录1.写在前面2.终止操作2.1 终止操作之查找与匹配2.2 终止操作之归约与收集1.写在前面 承接了上一篇文章(说完了Stream API的创建方式及中间操作):深入理解Java...
    99+
    2024-04-02
  • 怎么使用Java8中接口的新特性
    这篇文章主要介绍“怎么使用Java8中接口的新特性”,在日常操作中,相信很多人在怎么使用Java8中接口的新特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Java8中接口的新特性”的疑惑有所帮助!...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作