首页 > 编程语言 >Java 8 中Stream用法

Java 8 中Stream用法

时间:2024-05-27 11:55:45浏览次数:32  
标签:Java stream Stream 元素 List System 用法 out

StreamJava 8新增的接口,Stream可以认为是一个高级版本的 Iterator。 废话不多说直接上代码

 

package com.example.demo;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

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

@SpringBootTest
class DemoApplicationTests {

    /*
      1.filter:用于根据指定条件过滤元素.它接收一个条件作为参数, 只保留满足条件的元素, 并生成一个新的Stream
     */
    @Test
    void filterTest() {
        List<String> tempList = Arrays.asList("初一", "初二", "初三", "初四");
        List<String> resList = tempList.stream()
                .filter(s -> s.contains("二"))
                .collect(Collectors.toList());
        System.out.println(resList.toString());
    }

    /*
    2.map:用于对每个元素执行映射操作, 将元素转换成另一种类型.它接收一个Function(映射函数)作为参数,
          对每个元素应用该映射函数, 并生成一个新的Stream.
    */
    @Test
    void mapTest() {
        List<String> tempList = Arrays.asList("初一", "初二", "初三", "初四");
        List<String> resList = tempList.stream()
                .map(s -> "今天: " + s)
                .collect(Collectors.toList());
        System.out.println(resList.toString());
    }

    /*
    3.sorted():用于对Stream中的元素进行排序,默认按照自然顺序进行排序。也可以传入自定义的Comparator来指定排序规则。
    */
    @Test
    void sortedTest() {
        List<Integer> numList = Arrays.asList(10, 20, 18, 300, 30, 2);
        // ① 默认排序
        List<Integer> orderList = numList.stream()
                .sorted()
                .collect(Collectors.toList());
        System.out.printf("① 默认排序: %s%n", orderList);
        // ② 自定义排序
        List<Integer> orderDescList = numList.stream()
                .sorted((x, y) -> {
                    return y.compareTo(x);
                })
                .collect(Collectors.toList());
        System.out.printf("② 自定义排序: %s%n", orderDescList);
    }

    /*
    4.distinct():用于去除 Stream 中重复的元素,确保最终的 Stream 中每个元素都是唯一的。
    */
    @Test
    void distinctTest() {
        List<Integer> numList = Arrays.asList(1,1,1,1,2,3,2,2);
        List<Integer> distinctList = numList.stream()
                .distinct()
                .collect(Collectors.toList());
        System.out.println(distinctList);
    }

    /*
   5.limit(long n):用于限制Stream的大小,返回一个最大包含前n个元素的新Stream。
   */
    @Test
    void limitTest() {
        List<Integer> numList = Arrays.asList(1,2,3,4,5,6,7,8);
        List<Integer> limitList = numList.stream()
                .limit(4)
                .collect(Collectors.toList());
        System.out.println(limitList);
    }

    /*
    6.skip(long n):用于跳过Stream中的前n个元素,返回一个丢弃了前n个元素后剩余元素的新Stream。
    */
    @Test
    void skipTest() {
        List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
        List<Integer> skipList = numList.stream()
                .skip(numList.size() - 2)
                .collect(Collectors.toList());
        System.out.println(skipList);
    }

    /*
    7.forEach(Consumer):对Stream中的每个元素执行指定的操作,接收一个Consumer(消费者函数)作为参数。它通常用于对Stream中的元素进行输出或执行某些操作,但不会返回任何结果。
    */
    @Test
    void forEachTest() {
        // 给公司工资普涨 500
        List<Integer> salaryList = Arrays.asList(12000, 20000, 30000, 4000);
        salaryList.stream()
                .map(s -> s + 500)
                .forEach(s -> {
                    System.out.println("--工资普涨后:" + s);
                });
    }

    /*
    8.collect(Collector):用于将Stream中的元素收集到一个容器中,接收一个Collector(收集器)作为参数。它允许你在Stream中执行各种集合操作,
    例如将元素收集到List、Set、Map等容器中。

    如下代码的含义是创建一个人员集合,通过 stream() 转换为 Stream 流,使用 collect() 方法把元素归集,
    利用 Collectors.toMap() 收集器转换为 Map 后,内部接收会遍历每个元素,Collectors.toMap(User::getName, User::getSalary)是简写,
    详细的写法如下:Collectors.toMap(s -> s.getName(), s -> s.getSalary())
    */
    @Test
    void collectTest() {
        List<User> userList = Arrays.asList(new User("张三", 2000.5),
                new User("李斯", 11000.5),
                new User("王二", 12000.5),
                new User("张六", 32000.5),
                new User("赵公子", 1000000.0));
        Map<String, Double> userSalaryMap = userList.stream()
                .collect(Collectors.toMap(User::getName, User::getSalary));
        userSalaryMap.forEach((k, v) -> {
            System.out.printf("姓名:%s,工资:%.2f%n", k, v);
        });
    }

    /*
    9.anyMatch(Predicate) / allMatch(Predicate) / noneMatch(Predicate)
    Stream 类的 anyMatch(), allMatch(), 和 noneMatch() 是用于检查流中元素是否满足特定条件的终端操作。
    它们返回一个布尔值,表示流中的元素是否满足指定的条件。这些方法在遇到满足条件的元素后可能会提前终止流的处理。
    anyMatch检查是否有任意元素满足条件,allMatch检查是否所有元素都满足条件,noneMatch检查是否没有元素满足条件。
    */
    @Test
    void MatchTest() {
        // 示例整数流
        Stream<Integer> integerStream = Stream.of(1, 5, 3, 8, 2);

        // 使用anyMatch()检查是否存在元素大于5
        boolean anyGreaterThan5 = integerStream.anyMatch(num -> num > 5);
        System.out.println("是否存在元素大于 5 ?" + anyGreaterThan5);

        // 重新创建一个整数流,因为流已被消耗
        Stream<Integer> newIntegerStream = Stream.of(1, 5, 3, 8, 2);

        // 使用allMatch()检查是否所有元素都小于10
        boolean allLessThan10 = newIntegerStream.allMatch(num -> num < 10);
        System.out.println("所有元素都小于10 ? " + allLessThan10);

        // 重新创建一个整数流,因为流已被消耗
        Stream<Integer> newestIntegerStream = Stream.of(1, 5, 3, 8, 2);

        // 使用noneMatch()检查是否没有元素等于10
        boolean noneEqualTo10 = newestIntegerStream.noneMatch(num -> num == 10);
        System.out.println("是否没有元素等于 10 ? " + noneEqualTo10);
    }


    /*
   10.findFirst() / findAny()
        Stream 类的 findFirst() 和 findAny()
        方法用于在流中查找元素的终端操作。它们都返回一个 Optional 对象,表示找到的元素或元素的可能性。
   */
    @Test
    void findTest() {
        // 示例整数流
        Stream<Integer> integerStream = Stream.of(1, 5, 3, 8, 2);

        // 使用findFirst()找到第一个元素
        Optional<Integer> firstElementOptional = integerStream.findFirst();
        System.out.println("发现第一个元素: " + firstElementOptional.get());

        //isPresent() 判断流是否为null
        if (firstElementOptional.isPresent()) {
            System.out.println("发现第一个元素: " + firstElementOptional.get());
        } else {
            System.out.println("流为空!");
        }

         // 使用findAny()找到任意一个元素
        Stream<Integer> stream = Stream.of(1, 2, 3);
        Optional<Integer> any = stream.findAny();
        System.out.println("找到任意一个元素: " +any.get());
        // 资料说:可能输出 1、2 或 3 但实际操作每次都输出1

    }


}

 

package com.example.demo;

public class User {
    private String name;
    private Double salary;

    public String getName() {
        return name;
    }

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

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    public User(String name, Double salary) {
        this.name = name;
        this.salary = salary;
    }
}

 

标签:Java,stream,Stream,元素,List,System,用法,out
From: https://www.cnblogs.com/yclh/p/18215201

相关文章

  • 1915springboot VUE 宠物寄养平台系统开发mysql数据库web结构java编程计算机网页源码m
    一、源码特点 springbootVUE宠物寄养平台系统是一套完善的完整信息管理类型系统,结合springboot框架和VUE完成本系统,对理解JSPjava编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。springbootVUE宠物寄养......
  • pgsq的学习记录②——PostgreSQL基础用法
    PostgreSQL基础用法创建一个数据库操作数据库创建表删除表表插入数据查询表多表联查创建一个数据库创建一个名为postgres的数据库createdbpostgres操作数据库创建表创建表weatherCREATETABLEweather(cityvarchar(80),temp_lo......
  • java方法重写的语法要求
    ​ /* *重写要遵循"两同两小一大"原则: *1)两同: * 1.1)方法名相同 * 1.2)参数列表相同 *2)两小: * 2.1)子类方法的返回值类型小于或等于父类的 *   2.1.1)void时,必须相同 *   2.1.2)基本类型时,必须相同 *   2.1.3)引用类型时,小于或......
  • SCSS入门指南:基本语法与高效用法
    关于SCSS(SassyCSS)基本使用的文章概述:###1.SCSS简介*SCSS是一种CSS的扩展语言,它允许开发者使用更强大、更灵活的语法来编写样式表。*SCSS提供了变量、嵌套规则、混合宏等高级功能,使得CSS代码更加模块化和可维护。*SCSS最终被编译成标准的CSS文件,以供浏览器解析。###2.安......
  • 一个专为程序员设计的精致 Java 博客系统
    大家好,我是Java陈序员。今天,给大家介绍一个设计精致的博客系统,基于Java实现!关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。项目介绍bolo-solo——......
  • 【JAVA】Java如何使用Spring Boot进行Web服务开发
    文章目录前言一、函数解释二、代码实现三、总结前言在现代的微服务架构中,创建快速、可靠的Web服务已经成为一项基本技能。SpringBoot是一个出色的框架,它简化了Spring应用开发,使我们能够更快速地创建和部署Web服务。在这篇博客中,我们将探讨如何使用Java和SpringBoo......
  • Java JVM——1.JVM与Java体系结构
    前言作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题?✘ 运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM!✘ 想解决线上JVMGC问题,但却无从下手。✘ 新项目上线,对各种JVM参数设置一脸茫然,直接默认吧,然后就JJ了。✘ 每次面......
  • Java项目-基于springboot+vue的旅游管理系统(源码+数据库+文档)​
    如需完整项目,请私信博主基于SpringBoot+Vue的旅游管理系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven随着科学技术的飞速发展,网络快速发展、人民生活的快节奏都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,旅游管......
  • Java项目-基于springboot+vue的简历系统(源码+数据库+文档)​
    如需完整项目,请私信博主基于SpringBoot+Vue的简历系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,简历系统当然也不......
  • Java线程组
    Java提供了一种在单个对象中组合多个线程的便捷方法。通过这种方式,通过单个方法调用暂停,恢复或中断线程组。注意:现在不推荐使用suspend(),resume()和stop()方法。Java线程组由java.lang.ThreadGroup类实现。ThreadGroup表示一组线程。线程组还可以包括其他线程组。线程......