Java8新特性之Stream API详解

 更新时间:2021年04月25日 14:30:07   作者:油炸冰可乐  
这篇文章主要介绍了Java8新特性之StreamAPI详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下

一、前言

StreamAPI在Java8版本中使用,关注的是对数据的筛选、查找、存储等

它可以做的事情有:过滤、排序、映射、归约

二、使用流程

Stream实例化中间操作(过滤、排序、映射、规约)终止操作(匹配查找、归约、收集)

三、案例演示

public class EmployeeData {
   
   public static List<Employee> getEmployees(){
      List<Employee> list = new ArrayList<>();
      
      list.add(new Employee(1001, "马化腾", 34, 6000.38));
      list.add(new Employee(1002, "马云", 12, 9876.12));
      list.add(new Employee(1003, "刘强东", 33, 3000.82));
      list.add(new Employee(1004, "雷军", 26, 7657.37));
      list.add(new Employee(1005, "李彦宏", 65, 5555.32));
      list.add(new Employee(1006, "比尔盖茨", 42, 9500.43));
      list.add(new Employee(1007, "任正非", 26, 4333.32));
      list.add(new Employee(1008, "扎克伯格", 35, 2500.32));
      
      return list;
   }
   
}
package JDK_8;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamAPI {
    // 方式1:使用集合创建Stream
    @Test
    public void test1() {
        List<Employee> list = EmployeeData.getEmployees();
        // 返回一个顺序流
        Stream<Employee> stream = list.stream();
        // 返回一个并行流
        Stream<Employee> employeeStream = list.parallelStream();
    }

    // 方式2:使用数组创建流对象
    @Test
    public void test2() {
        Employee e1 = new Employee(1003, "WZY", 26, 3000.69);
        Employee e2 = new Employee(1007, "王紫玉", 25, 8888);

        Employee[] list2 = new Employee[]{e1, e2};
        Stream<Employee> stream = Arrays.stream(list2);
        stream.forEach(System.out::println);

    }

    // 通过Stream.of 创建
    @Test
    public void test3() {
        Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
        stream.forEach(System.out::println);
    }

    // Stream.filter进行过滤
    @Test
    public void test4() {
        List<Employee> list = EmployeeData.getEmployees();
        list.stream().filter(employee -> employee.getAge() > 25).forEach(System.out::println);
    }

    // 使用StreamAPI筛选
    @Test
    public void test5() {
        List<Employee> list = EmployeeData.getEmployees();
        list.add(new Employee(1004, "wzy", 25, 18888));
        list.add(new Employee(1004, "wzy", 25, 18888));
        list.add(new Employee(1004, "wzy", 25, 18888));
        list.add(new Employee(1004, "wzy", 25, 18888));

        list.stream().forEach(System.out::println);
        System.out.println();
        list.stream().distinct().forEach(System.out::println);
    }

    @Test
    public void test6() {
        List<String> list = Arrays.asList("a", "b", "c");
//        map(Function<? super T,? extends R> mapper)
//        返回由给定函数应用于此流的元素的结果组成的流。
        list.stream().map(s -> s.toUpperCase()).forEach(System.out::println);

    }

    // 使用StreamAPI筛选:工资大于6000的员工
    @Test
    public void test7() {
        List<Employee> list = EmployeeData.getEmployees();
        list.stream().filter(s -> s.getSalary() > 6000).forEach(System.out::println);
    }

    // StreamAPI映射:map,接收参数,将参数转换为其他形式的信息;
    @Test
    public void test8() {
        List<Employee> list = EmployeeData.getEmployees();
        list.stream().map(e -> e.getAge()).forEach(System.out::println);

    }

    // StreamAPI排序,sorted帮助实现Comparable接口进行对象比较
    @Test
    public void test9() {
        List<Employee> list = EmployeeData.getEmployees();
        list.stream().sorted((e1, e2) -> {
            int ageValue = Integer.compare(e1.getAge(), e2.getAge());
            if (ageValue != 0) {
                return ageValue;
            } else {
                return Double.compare(e1.getSalary(), e2.getSalary());
            }
        }).forEach(System.out::println);
    }

    // StreamAPI匹配:所有元素是否满足下列条件
    @Test
    public void test10() {
        List<Employee> list = EmployeeData.getEmployees();
        boolean allMatch = list.stream().allMatch(e -> e.getSalary() > 5000);
        System.out.println(allMatch);
    }

    // StreamAPI查找:返回第一个元素
    @Test
    public void test11() {
        List<Employee> list = EmployeeData.getEmployees();
        Optional<Employee> first = list.stream().findFirst();
        System.out.println(first);
    }

    // StreamAPI查找:返回薪水数最大的员工
    @Test
    public void test12() {
        List<Employee> list = EmployeeData.getEmployees();
        Stream<Double> salaryStream = list.stream().map(e -> e.getSalary());
        Optional<Double> max = salaryStream.max(Double::compare);
        System.out.println(max);
    }

    // StreamAPI查找:薪水最小的员工对像
    @Test
    public void test13() {
        List<Employee> list = EmployeeData.getEmployees();
        Optional<Employee> min = list.stream().min((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));
        System.out.println(min);
    }

    // StreamAPI:归约
    @Test
    public void test14() {
        List<Employee> list = EmployeeData.getEmployees();
        Stream<Double> salaryStream = list.stream().map(e -> e.getSalary());
        Optional<Double> sum = salaryStream.reduce((s1, s2) -> s1 + s2);
        System.out.println(sum.get());
    }

    // StreamAPI:收集
    @Test
    public void test15(){
        List<Employee> list = EmployeeData.getEmployees();
        List<Employee> employeeList = list.stream().filter(e -> e.getSalary() > 5000).collect(Collectors.toList());
        for (Employee employee : employeeList) {
            System.out.println(employee);
        }
    }
}

到此这篇关于Java8新特性之StreamAPI详解的文章就介绍到这了,更多相关java StreamAPI详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis Plus中的流式查询案例

    Mybatis Plus中的流式查询案例

    这篇文章主要介绍了Mybatis Plus中的流式查询案例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Spring Boot 如何正确读取配置文件属性

    Spring Boot 如何正确读取配置文件属性

    这篇文章主要介绍了Spring Boot 如何正确读取配置文件属性,项目中经常会经常读取配置文件中的属性的值,Spring Boot提供了很多注解读取配置文件属性,那么如何正确使用呢,下文一起来参考下面文章内容吧
    2022-04-04
  • 关于通过Java连接mysql对反斜杠”\“转义的测试详解

    关于通过Java连接mysql对反斜杠”\“转义的测试详解

    这篇文章主要给大家介绍了关于通过Java连接mysql对反斜杠”\“转义的测试的相关资料,文中通过实例代码介绍的非常详细,对大家理解反斜杠”\“转义具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • Java使用Ajax异步上传文件

    Java使用Ajax异步上传文件

    使用Ajax上传文件的应用场景颇多,比如上传用户头像、博客文章中插入图片、对认证用户相关身份进行校验等等很多很多。本文提供一个简单的示例供大家参考
    2021-05-05
  • Springboot整合logback的详细教程

    Springboot整合logback的详细教程

    这篇文章主要介绍了Springboot整合logback的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • 详解Java中static关键字的使用和原理

    详解Java中static关键字的使用和原理

    static可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。本文就来详细说说他的使用和原理,需要的可以参考一下
    2022-10-10
  • Java受检异常的一些思考

    Java受检异常的一些思考

    受检异常是否真的有必要?这是一个争论了很久的问题,至今仍然没有一个确定的答案。Java的受检异常,被很多人吐槽,也被很多人喜爱,当然他们都可以拿出很多的理由来证明自己的观点。
    2020-12-12
  • 使用maven命令安装jar包到本地仓库的方法步骤

    使用maven命令安装jar包到本地仓库的方法步骤

    这篇文章主要介绍了使用maven命令安装jar包到本地仓库的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java 实现FTP服务实例详解

    Java 实现FTP服务实例详解

    这篇文章主要介绍了Java 实现FTP服务实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java使用策略模式实现聚石塔接口调用的问题

    Java使用策略模式实现聚石塔接口调用的问题

    这篇文章主要介绍了Java使用策略模式实现聚石塔接口调用,为了避免多重判断,而且有更好的扩展性,首选了策略模式来实现,具体解决方法跟随小编一起看看吧
    2021-12-12

最新评论