Java—JDK8新特性—Steam流

本文介绍了Java8中的StreamAPI,它引入了函数式编程的概念,提高了编程效率。StreamAPI允许对集合进行高效的操作,如查找、过滤和映射。文章详细阐述了Stream的创建、使用步骤、中间操作(如迭代、匹配和查找)以及终止操作(如计数、找最大值和最小值)。通过示例展示了如何使用forEach进行迭代,如何使用match方法进行条件判断,以及find方法在查找数据中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

5. Steam流

5.1 什么是Steam流        

5.2 为什么要去使用Steam流

5.3 什么是Steam流

5.4 Stream流使用步骤

5.5 创建Steam流的方法

5.6 终止操作

5.6.1 迭代

5.6.2 匹配

5.6.3 查找

5.6.4 统计


5. Steam流

5.1 什么是Steam流        

        在JDK 8中提供了Stream API,把真正的函数式编程风格引入到Java中,它可以极大提供Java程序员的生产力,让程序员写出高效率、干净、简洁的代码
        Stream是JDK 8中处理集合的关键抽象概念,它可以指定你希望对进行的操作,可以执非常复杂查找、过滤和映射数据等。使用
        Stream APl对集合数据进行操作,就类似于使用SQL执行的数据库查询。也可以使用Stream API来并行执行操作。简而言之,StreamAPI提供了一种高效且易于使用的处理数据的方式。

5.2 为什么要去使用Steam流

        可以极大的简化开发


5.3 什么是Steam流


        Stream是数据渠道,用于操作数据源(如:集合、数组等)所生成的元素序列。

特别注意:集合是数据,Stream是计算
注意:

  • 1.Stream 不会存储元素
  • 2.Stream 不会改变源对象,而是返回一个持有结果的新Stream
  • 3.Stream 操作是延迟执行的,这意味着它们会等到需要结果时才执行

5.4 Stream流使用步骤

        通过以下几个步骤来完成:

  • 1.创建Stream:一个数据源(如:集合、数组),获取一个流
  • 2.中间操作:一个中间操作链,对数据源的数据进行处理
  • 3.终止操作:一旦执行终止操作,就执行中间操作链,并产生结果,之后不会再被使用

5.5 创建Steam流的方法

        以下3种方式来创建:

  • 通过Collection的stream 默认方法获取
  • 通过Stream接口的静态方法of 获取
  • 通过Arrays中的stream 获取
  • 创建无限流 使用Stream.iterate() 或者 Stream.generate()

5.6 终止操作

        当一个Stream方法执行之后,返回的结果不是Stream类型的时候,该操作为终止操作

        终止操作会消费流,会产生一个结果

        如果一个Stream流被消费之后,这个Stream流就不用重新使用

5.6.1 迭代

        迭代流中的数据使用方法是forEach()方法

public class StreamForEachDemo1 {
    /**
     * Stream 终止操作中的迭代方法,使用forEach()方法
     * @param args
     */
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Collections.addAll(list,"Java ","C ","C++ ","Python ","Go ");
        list.stream().forEach(System.out::print);
    }
}

5.6.2 匹配

        判断数据是否匹配指定的条件,使用Match相关的方法,返回值类型为boolean

方法名描述
allMatch(Predicate p)全部元素满足条件,则返回true,否则返回false
anyMatch(Predicate p)

只要有一个满足条件,则返回true;

全部元素不满足条件返回false

noneMatch(Predicate p)全部元素不满足条件,则返回true,否则返回false

public class StreamMatchDemo {

    @Test
    public void testAllmatch() {
        Stream<Integer> stream = Stream.of(1,2,7,8,9,11);
        /**
         * 判断所有元素 是否 都大于0
         *  只要有一个元素不符合条件,就返回false
         *  必修全部元素都符合条件,才能返回true
         */
        Boolean result1 = stream.allMatch(s -> s>0);
        System.out.println("result1:" + result1); //result1:true
    }

    @Test
    public void testAnymatch() {
        Stream<Integer> stream = Stream.of(1,2,7,8,9,11);
        /**
         * 判断所有元素 是否 都大于10
         *  只要有一个元素符合条件,就返回true
         *  必修全部元素都不符合条件,才能返回false
         */
        Boolean result2 = stream.anyMatch(s -> s>10);
        System.out.println("result2:" + result2); //result2:false
    }
    @Test
    public void testNoneMatch() {
        Stream<Integer> stream = Stream.of(1,2,7,8,9,11);
        /**
         * 判断所有元素 是否 都大于10
         *  全部元素,不满足条件,就返回true
         *  否则,返回false
         */
        Boolean result3 = stream.noneMatch(s -> s>10);
        System.out.println("result3:" + result3); //result3:false
    }
}

5.6.3 查找

        找到某些数据,使用find相关的方法,返回类型为Optional<T>

方法名描述
findFirst()返回找到的第一个元素
findAny()返回当前流中的任意元素


/**
 * 终止操作 中的 查找 使用find相关的方法
 * 1.findFirst 用于查找第一个匹配的元素
 * 2.findAny  用于在流中查找能匹配的元素 一般用于并行流
 *
 */
public class StreamFindDemo {
    @Test
    public void testFindFirst() {
        Stream<Integer> numbers = Stream.of(444,45,2,3,45,6,8,77,99);

        Optional<Integer> numbersFirst = numbers.findFirst();
        System.out.println(numbersFirst); //Optional[444]
        System.out.println(numbersFirst.get()); //444
    }

    @Test
    public void testFinfAny() {
        Stream<Integer> numbers = Stream.of(666,45,2,3,45,6,8,77,99);
        Optional<Integer> numbersAny = numbers.findAny();
        System.out.println(numbersAny); //Optional[666]
        System.out.println(numbersAny.get()); //666
    }
}

5.6.4 统计

方法名描述
count()返回流中元素的总数
max(Comparator c)返回流中的最大值
min(Comparator c)返回流中的最小值
/**
 * Stream流终止查找 中 统计
 * 1.count :返回流中元素的总数
 * 2.max(Comparator c) :返回流中的最大值
 * 3.min(Comparator c) :返回流中的最小值
 */
public class StreamMaxAndMinDemo {
    @Test
    public void testCount() {
        Stream<Integer> numbers = Stream.of(1,2,3,4,5,6,7,8,9,100);
        long count = numbers.count();
        System.out.println(count); //10
    }
    @Test
    public void testMax() {
        Stream<Integer> numbers = Stream.of(1,2,3,4,5,6,7,8,9,100);
        Optional<Integer> max = numbers.max(Integer::compareTo);
        System.out.println(max); //Optional[100]
        System.out.println(max.get()); //100
    }
    @Test
    public void testMin() {
        Stream<Integer> numbers = Stream.of(1,2,3,4,5,6,7,8,9,100);
        Optional<Integer> min = numbers.min(Integer::compareTo);
        System.out.println(min); //Optional[1]
        System.out.println(min.get()); //1
    }
}

本章节未完结,待更新!

感谢支持 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值