java8集合的新特性_流(Stream)

Java 8 Stream 流详细教程 - 全面指南 本文详细介绍了Java 8 Stream API的核心概念与实用技巧。主要内容包括:1. Stream基础概念与创建方式(集合/数组/文件/生成器);2. 中间操作详解(过滤/映射/排序等9类操作);3. 终端操作方法(收集/归约/匹配等7类操作);4. Collectors收集器的6种使用场景;5. 并行流优化与原始类型流的性能优势;6. 实际应用案例与性能优化建议。 文章通过200+代码示例展示了Stream API在数据处理、电商分析等场景的应用,并给出了提高可读性、处理异常、资源管理等最佳实践。St 阅读详情

1、什么是Stream流

Java8提供的stream API可以让程序员像操作数据库一样操作集合。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。

2、Stream流的特性

a、stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。
b、stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
c、stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。

3、创建流

    
    public void test(){//创建流
        List<String> list = new ArrayList<>();
        //获取一个顺序流  可以理解成异步 把一个内容分成多个数据块,使用同一个线程按顺序处理每个数据块的流。
        Stream<String> stream = list.stream(); //获取一个顺序流
        //获取一个并行流  可以理解成同步 把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。
        Stream<String> parallelStream = list.parallelStream();
    }

4、基础用法

4.1、遍历(循环)foreach

    
    public void test2(){//遍历循环
        List<Integer> list = Arrays.asList(1,2,3,4,5);
        System.out.println("所有元素:");
        list.stream().forEach( o -> { //o表示循环的对象(根据集合类型  集合类型是对象则o是对象  集合类型是某个字符串  o则是字符串)
            System.out.println(o);
        });
    }

执行结果:
在这里插入图片描述

4.2、过滤(筛选)filter、findFirst

    
    public void test3(){//过滤(筛选)filter、findFirst、findAny
        //filter 过滤
        List<Integer> list = Arrays.asList(1,2,3,4,5);
        System.out.println("大于2的元素:");
        //遍历集合里大于2的每一个元素
        list.stream().filter(x-> x > 2).forEach(System.out::println);

        //findFirst 用于获取第一个满足条件的元素
        System.out.println("获取第一个小于4的元素:");
        Optional<Integer> first = list.stream().filter(x -> x < 4).findFirst();
        System.out.println(first.get());
    }

执行结果:
在这里插入图片描述

4.3、映射(map/flatMap)

映射,可以将一个流的元素按照一定的映射规则映射到另一个流中。分为map和flatMap:
a、map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
b、flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。

创建User实体:

package com;

import lombok.Data;


public class User {

    private String name;

    private Integer age;

    public User(String name,Integer age){
        this.name = name;
        this.age = age;
    }

}

实例:

    
    public void test4(){//映射(map/flatMap)
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));

        //筛选出年龄大于18的员工名称 将User user 映射成o
        List<String> collect = userList.stream()
                //o 表示声明的对象名称 这里 o 相当于 User o = new User() 这里o可以随意命名遵守变量命名规范即可。
                .filter(o -> o.getAge() > 18)
                .map(User::getName)
                .collect(Collectors.toList());

        collect.forEach(System.out::println);

        List<String> list = Arrays.asList("a-s-d-f", "1-3-5-7");
        List<String> listNew = list.stream().flatMap(x -> {
            // 将每个元素转换成一个stream
            String[] split = x.split("-");
            Stream<String> y = Arrays.stream(split);
            return y;
        }).collect(Collectors.toList());

        System.out.println("处理之前的集合:" + list);
        System.out.println("处理之后的集合:" + listNew);

    }

执行结果:
在这里插入图片描述

4.4、聚合(max/min/count)

1、count:返回流中元素的总个数
2、max:返回流中元素最大值
3、min:返回流中元素最小值

实例:

    
    public void test5(){//聚合(max/min/count)
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));
        Optional<String> max = userList.stream().max(Comparator.comparing(User::getAge)).map(User::getName);
        Optional<String> min = userList.stream().min(Comparator.comparing(User::getAge)).map(User::getName);
        long count = userList.stream().filter(user -> user.getAge() > 18).count();
        System.out.println("年龄最大的用户:"+max.get());
        System.out.println("年龄最小的用户:"+min.get());
        System.out.println("年龄大于18的用户数量:"+count);
    }

执行结果:
在这里插入图片描述

4.5、归约(reduce)

归约:把一个流缩减成一个值,能实现对集合求和、求乘积和求最值操作。
实例:

   
    public void test6(){//归约(reduce)
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));

        //求所有人年龄总和
        Optional<Integer> min = userList.stream().map(User::getAge).reduce(Integer::min);
        Optional<Integer> max = userList.stream().map(User::getAge).reduce(Integer::max);
        Optional<Integer> sum = userList.stream().map(User::getAge).reduce(Integer::sum);
        System.out.println("年龄最小:"+min.get());
        System.out.println("年龄最大:"+max.get());
        System.out.println("年龄总和:"+sum.get());
    }

执行结果:
在这里插入图片描述

4.6、收集(collect)

收集:可以说是内容最繁多、功能最丰富的部分了。从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合。
实例:

 
    public void test7(){//收集(collect)
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));
        //获取年龄大于18的List集合
        List<User> toList = userList.stream().filter(user -> user.getAge() > 18).collect(Collectors.toList());
        //获取年龄大于18的set集合
        Set<User> toSet = userList.stream().filter(user -> user.getAge() > 18).collect(Collectors.toSet());
        //获取年龄大于18的map集合
        Map<Integer, User> toMap = userList.stream().filter(user -> user.getAge() > 18).collect(Collectors.toMap(User::getAge, user -> user));
        //获取年龄集合
        List<Integer> ageList = userList.stream().map(o -> o.getAge()).collect(Collectors.toList());
        //获取姓名集合
        List<String> nameList = userList.stream().map(o -> o.getName()).collect(Collectors.toList());
        System.out.println("年龄大于18的List集合:"+toList);
        System.out.println("获取年龄大于18的set集合:"+toSet);
        System.out.println("获取年龄大于18的map集合:"+toMap);
        System.out.println("年龄集合:"+ageList);
        System.out.println("姓名集合:"+nameList);
    }

执行结果:
在这里插入图片描述

4.7、统计(count/averaging)

Collectors提供了一系列用于数据统计的静态方法:
计数:count
平均值:averagingInt、averagingLong、averagingDouble
最值:maxBy、minBy
求和:summingInt、summingLong、summingDouble
统计以上所有:summarizingInt、summarizingLong、summarizingDouble

实例:

   
    public void test8(){//统计(count/averaging)
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));

        //员工总数
        Long count = userList.stream().collect(Collectors.counting());
        // 平均年龄
        Double average = userList.stream().collect(Collectors.averagingDouble(User::getAge));
        // 最高年龄
        Optional<Integer> max = userList.stream().map(User::getAge).collect(Collectors.maxBy(Integer::compare));
        // 年龄之和
        Integer sum = userList.stream().collect(Collectors.summingInt(User::getAge));
        // 一次性统计所有信息,包含前面五种
        DoubleSummaryStatistics collect = userList.stream().collect(Collectors.summarizingDouble(User::getAge));

        System.out.println("员工总数:" + count);
        System.out.println("员工平均年龄:" + average);
        System.out.println("员工年龄总和:" + sum);
        System.out.println("员工年龄所有统计:" + collect);
    }

执行结果:
在这里插入图片描述

4.8、分组(partitioningBy/groupingBy)

实例:

    
    public void test9(){//分组
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));

        //是否大于18分组
        Map<Boolean, List<User>> partitioningBy = userList.stream().collect(Collectors.partitioningBy(user -> user.getAge() > 18));
        //按照年龄分组
        Map<Integer, List<User>> groupingBy = userList.stream().collect(Collectors.groupingBy(User::getAge));
        //多条件分组
        Map<Integer, Map<String, List<User>>> collect = userList.stream().collect(Collectors.groupingBy(User::getAge, Collectors.groupingBy(User::getName)));
        System.out.println("partitioningBy:"+partitioningBy);
        System.out.println("groupingBy:"+groupingBy);
        System.out.println("collect:"+collect);

    }

执行结果:
在这里插入图片描述

4.9、接合(joining)

joining:可以将stream中的元素用特定的连接符(没有的话,则直接连接)连接成一个字符串。
实例:

    
    public void test10(){
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));
        //将所有人名称用,隔开
        String collect = userList.stream().map(User::getName).collect(Collectors.joining(","));
        System.out.println(collect);
    }

执行结果:
在这里插入图片描述

4.10、排序(sorted)

实例:

    
    public void test11(){
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("王五",38));
        userList.add(new User("李四",28));
        //按照年龄排序隔开
        String sorted = userList.stream().sorted(Comparator.comparing(User::getAge)).map(User::getName).collect(Collectors.joining(","));
        String sorted2 = userList.stream().sorted(Comparator.comparing(User::getAge).reversed()).map(User::getName).collect(Collectors.joining(","));
        System.out.println("正序:"+sorted);
        System.out.println("倒序:"+sorted2);
    }

执行结果:
在这里插入图片描述

5、代码案例(全)

5.1 实体

package com;

import lombok.Data;


public class User {

    private String name;

    private Integer age;

    public User(String name,Integer age){
        this.name = name;
        this.age = age;
    }

}

5.2 测试类

import com.User;
import org.junit.Test;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Stream流的常见用法
 */
public class StreamDemo {

    
    public void test(){//创建流
        List<String> list = new ArrayList<>();
        //获取一个顺序流  可以理解成异步 把一个内容分成多个数据块,使用同一个线程按顺序处理每个数据块的流。
        Stream<String> stream = list.stream(); //获取一个顺序流
        //获取一个并行流  可以理解成同步 把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。
        Stream<String> parallelStream = list.parallelStream();
    }

    
    public void test2(){//遍历循环
        List<Integer> list = Arrays.asList(1,2,3,4,5);
        System.out.println("所有元素:");
        list.stream().forEach( o -> { //o表示循环的对象(根据集合类型  集合类型是对象则o是对象  集合类型是某个字符串  o则是字符串)
            System.out.println(o);
        });
    }

    
    public void test3(){//过滤(筛选)filter、findFirst
        //filter 过滤
        List<Integer> list = Arrays.asList(1,2,3,4,5);
        System.out.println("大于2的元素:");
        //遍历集合里大于2的每一个元素
        list.stream().filter(x-> x > 2).forEach(System.out::println);

        //findFirst 用于获取第一个满足条件的元素
        System.out.println("获取第一个小于4的元素:");
        Optional<Integer> first = list.stream().filter(x -> x < 4).findFirst();
        System.out.println(first.get());
    }

    
    public void test4(){//映射(map/flatMap)
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));

        //筛选出年龄大于18的员工名称 将User user 映射成o
        List<String> collect = userList.stream()
                //o 表示声明的对象名称 这里 o 相当于 User o = new User() 这里o可以随意命名遵守变量命名规范即可。
                .filter(o -> o.getAge() > 18)
                .map(User::getName)
                .collect(Collectors.toList());

        collect.forEach(System.out::println);

        List<String> list = Arrays.asList("a-s-d-f", "1-3-5-7");
        List<String> listNew = list.stream().flatMap(x -> {
            // 将每个元素转换成一个stream
            String[] split = x.split("-");
            Stream<String> y = Arrays.stream(split);
            return y;
        }).collect(Collectors.toList());

        System.out.println("处理之前的集合:" + list);
        System.out.println("处理之后的集合:" + listNew);

    }

    
    public void test5(){//聚合(max/min/count)
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));
        Optional<String> max = userList.stream().max(Comparator.comparing(User::getAge)).map(User::getName);
        Optional<String> min = userList.stream().min(Comparator.comparing(User::getAge)).map(User::getName);
        long count = userList.stream().filter(user -> user.getAge() > 18).count();
        System.out.println("年龄最大的用户:"+max.get());
        System.out.println("年龄最小的用户:"+min.get());
        System.out.println("年龄大于18的用户数量:"+count);
    }

    
    public void test6(){//归约(reduce)
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));

        //求所有人年龄总和
        Optional<Integer> min = userList.stream().map(User::getAge).reduce(Integer::min);
        Optional<Integer> max = userList.stream().map(User::getAge).reduce(Integer::max);
        Optional<Integer> sum = userList.stream().map(User::getAge).reduce(Integer::sum);
        System.out.println("年龄最小:"+min.get());
        System.out.println("年龄最大:"+max.get());
        System.out.println("年龄总和:"+sum.get());
    }

    
    public void test7(){//收集(collect)
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));
        //获取年龄大于18的List集合
        List<User> toList = userList.stream().filter(user -> user.getAge() > 18).collect(Collectors.toList());
        //获取年龄大于18的set集合
        Set<User> toSet = userList.stream().filter(user -> user.getAge() > 18).collect(Collectors.toSet());
        //获取年龄大于18的map集合
        Map<Integer, User> toMap = userList.stream().filter(user -> user.getAge() > 18).collect(Collectors.toMap(User::getAge, user -> user));
        //获取年龄集合
        List<Integer> ageList = userList.stream().map(o -> o.getAge()).collect(Collectors.toList());
        //获取姓名集合
        List<String> nameList = userList.stream().map(o -> o.getName()).collect(Collectors.toList());
        System.out.println("年龄大于18的List集合:"+toList);
        System.out.println("获取年龄大于18的set集合:"+toSet);
        System.out.println("获取年龄大于18的map集合:"+toMap);
        System.out.println("年龄集合:"+ageList);
        System.out.println("姓名集合:"+nameList);
    }

    
    public void test8(){//统计(count/averaging)
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));

        //员工总数
        Long count = userList.stream().collect(Collectors.counting());
        // 平均年龄
        Double average = userList.stream().collect(Collectors.averagingDouble(User::getAge));
        // 最高年龄
        Optional<Integer> max = userList.stream().map(User::getAge).collect(Collectors.maxBy(Integer::compare));
        // 年龄之和
        Integer sum = userList.stream().collect(Collectors.summingInt(User::getAge));
        // 一次性统计所有信息,包含前面五种
        DoubleSummaryStatistics collect = userList.stream().collect(Collectors.summarizingDouble(User::getAge));

        System.out.println("员工总数:" + count);
        System.out.println("员工平均年龄:" + average);
        System.out.println("员工年龄总和:" + sum);
        System.out.println("员工年龄所有统计:" + collect);
    }

    
    public void test9(){//分组
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));

        //是否大于18分组
        Map<Boolean, List<User>> partitioningBy = userList.stream().collect(Collectors.partitioningBy(user -> user.getAge() > 18));
        //按照年龄分组
        Map<Integer, List<User>> groupingBy = userList.stream().collect(Collectors.groupingBy(User::getAge));
        //多条件分组
        Map<Integer, Map<String, List<User>>> collect = userList.stream().collect(Collectors.groupingBy(User::getAge, Collectors.groupingBy(User::getName)));
        System.out.println("partitioningBy:"+partitioningBy);
        System.out.println("groupingBy:"+groupingBy);
        System.out.println("collect:"+collect);

    }

    
    public void test10(){
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("李四",28));
        userList.add(new User("王五",38));
        //将所有人名称用,隔开
        String collect = userList.stream().map(User::getName).collect(Collectors.joining(","));
        System.out.println(collect);
    }

    
    public void test11(){
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("王五",38));
        userList.add(new User("李四",28));
        //按照年龄排序隔开
        String sorted = userList.stream().sorted(Comparator.comparing(User::getAge)).map(User::getName).collect(Collectors.joining(","));
        String sorted2 = userList.stream().sorted(Comparator.comparing(User::getAge).reversed()).map(User::getName).collect(Collectors.joining(","));
        System.out.println("正序:"+sorted);
        System.out.println("倒序:"+sorted2);
    }

}

Java 入门指南:Java 8 新特性 —— Stream 流 Java Stream 是 Java 8 引入的一个新的API,它提供了一种函数式编程的方式来处理集合数据。Stream 可以看作是一系列支持高效的、函数式操作的元素序列。 通过使用Stream,可以对集合进行 过滤、映射、排序、查找 等操作,而不需要显示地使用循环或者迭代器。Stream API 使用一种类似于 SQL 查询的方式来操作数据,这样可以使代码更加简洁、可读性更强。 阅读详情

相关推荐

37 | Java 8流(Stream)

流是一种用于处理数据的抽象概念,它允许你以一种声明性的方式对数据进行操作。流可以执行一系列的操作来过滤、转换、组合和汇总数据,而不需要显式的循环。流通常用于集合(例如List、Set、Map等)、数组或I/O操作。

微信号:RunsenLiu 6277

【Java 8系列】Stream详解,看这一篇就够啦

热门系列: 【Java 8系列】Java开发者的判空利器 -- Optional 【Java 8系列】Lambda 表达式,一看就废 程序人生,精彩抢先看 1.前言 2.正文 3.总结 ...

Yangy的博客 5万+

图像传感器与信号处理——详解CCD与CMOS图像传感器

一文详解CCD与CMOS图像传感器一文详解CCD与CMOS图像传感器1. 图像传感器性能关键词1.1 噪声1.2 暗电流 一文详解CCD与CMOS图像传感器 本文主要总结了CCD与CMOS传感器的原理知识,参考书籍为《数码相机中图像传感器和信号处理》,英文版为《Image Sensors And Signal Processing for Digital Still Cameras》 1. 图像传...

weixin_44580210的博客 2万+

万字详解 Stream 流式编程,写代码也可以很优雅

Stream(流)是 Java 8 引入的一个新的抽象概念,它代表着一种处理数据的序列。简单来说,Stream 是一系列元素的集合,这些元素可以是集合、数组、I/O 资源或者其他数据源。Stream API 提供了丰富的操作方法,可以对 Stream 中的元素进行各种转换、过滤、映射、聚合等操作,从而实现对数据的处理和操作。Stream API 的设计目标是提供一种高效、可扩展和易于使用的方式来处理大量的数据。

兴趣是最好的老师,勤能补拙 1815

URDF模型转换实战:解决SolidWorks到Gazebo的五大常见问题

本文详细解析了从SolidWorks导出URDF模型到Gazebo仿真过程中常见的五大问题及解决方案,包括插件安装、坐标系建立、Link与Joint配置等关键步骤。通过实战经验分享,帮助机器人仿真工程师高效完成模型转换,确保Gazebo仿真准确性。

weixin_29052717的博客 445

用友YonSuite产品实操手把手教学(图文版)

用友YonSuite

ct341688的博客 8165

stream流去除对象的值_Java1.8新特性Stream流处理集合元素

packagejavastream;importjava.math.BigDecimal;importjava.util.ArrayList;importjava.util.Comparator;importjava.util.List;importjava.util.Map;importjava.util.Optional;importjava.util.TreeSet;importjava.u...

weixin_32488761的博客 1563

UDS自动化测试-Service 0x27(CAPL调用dll实现key计算)

相信读者基于Diagnostic/ISO TP Confighration中cdd、dll文件的测试并不陌生,本文基于其的基础上,介绍在capl中调用内置的函数diagGenerateKeyFromSeed实现27服务解锁,从而进行诊断自动化测试。本文基于4个byte的Seed、16个byte的Key的安全访问,实现27服务的自动化测试。需要加载项目使用的cdd文件,如果没有的情况下可以使用canoe例程中默认的cdd文件。

诊断协议那些事儿's blog 2054

【java8新特性】stream流的方式遍历集合和数组

前言: 在没有接触java8的时候,我们遍历一个集合都是用循环的方式,从第一条数据遍历到最后一条数据,现在思考一个问题,为什么要使用循环,因为要进行遍历,但是遍历不是唯一的方式,遍历是指每一个元素逐一进行处理(目的),而并不是从第一个到最后一个顺次处理的循环,前者是目的,后者是方式。 所以为了让遍历的方式更加优雅,出现了流(stream)! 1.流的目的在于强掉做什么 假设一个案例:将集合A根据条...

李光 未来科技 3万+

【YOLOv11多模态融合改进】(可见光+红外)涉及像素级融合、特征级融合(中期、中后期、后期)、决策级融合的完整配置步骤以及二次改进方案

在网络输入阶段将多模态数据直接合并,形成统一的特征表示。

Limiiiing的博客 1967

【OpenClaw从入门到精通】第26篇:从0到1构建OpenClaw二次发行版——企业专属AI平台实战指南(2026实测)

本文基于OpenClaw 2026.3.7开源内核,聚焦企业级AI平台的二次发行构建,从技术原理、实操流程到商业落地提供完整方法论。核心围绕“内核层-能力层-产品层”三层架构,详解源码编译、私有化部署、企业级特性开发(数据合规、国产化适配、业务系统集成)、产品化包装等关键步骤,并通过审计行业“智审助手”虚拟实战案例具象化落地路径。文章兼顾新手入门与进阶提升,提供可直接复用的代码、配置文件及执行结果,解决企业对AI Agent“开箱即用”“数据不出域”“业务适配”的核心诉求,助力开发者快速打造企业专属AI平台

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 713

Java 8 新特性:集合 Stream 流及其用法

Stream 是一种对集合对象进行操作的抽象方式,允许我们以声明性的方法处理数据。与传统的集合不同,Stream 不会存储数据,它只是对数据源(如集合、数组)进行计算的视图。Stream 可以是顺序的,也可以是并行的,这使得它在处理大量数据时非常高效。Java 8 的 Stream 流特性为集合操作提供了更加灵活和强大的方式。通过函数式编程的风格,可以以更加简洁、可读的方式来处理数据。掌握 Stream 的使用,可以大大提高你的 Java 编程效率。

m0_54187478的博客 825

基于imx6ull平台opencv的图像采集、ffmpeg推流和Windows端拉流(多线程)

本文档是针对imx6ull平台`opencv`的图像采集、ffmpeg推流和Windows端拉流。首先创建一个线程`opencv`通过摄像头采集视频图像,接着再创建两个线程,其中一个线程获取采集的视频图像送给ffmpeg服务,另一个线程用于获取采集的视频图像并处理,处理完并在显示屏上显示,详细的流程请参看如下。

程小二的博客 1607

JAVA8新特性--集合流操作Stream

JAVA8新特性–集合流操作Stream Java 8 引入,位于java.util.stream包中,与 java.io 包里的输入输出流 InputStream 和 OutputStream 是不同的概念。 Stream API 借助 Lambda 表达式,可以提高编程效率和程序可读性。 什么是 Stream? Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。 数据源 流的来源。 可以是集合,数组,

qq_25447799的博客 2221

无人机:DJI Matrice 200 Series_(13).行业应用案例分析

在前一节中,我们介绍了DJI Matrice 200系列无人机的基本硬件配置和性能参数。本节将通过具体的行业应用案例,分析如何利用DJI Matrice 200系列无人机进行二次开发,以满足不同行业的需求。

zhubeibei168的博客 1448

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java8新特性——Stream流:不同于IO流的流,操作集合数据

文章目录1、什么是Stream流1、认识Stream流2、Stream流和Collection的区别3、流的获取方式4、流操作和管道 1、什么是Stream流 1、认识Stream流 2、Stream流和Collection的区别 在Package java.util.stream这个包中引入的关键类是stream。 类Stream、IntStream、LongStream和DoubleStream是对象上的流以及原始int、long和double类型。流在几个方面与集合不同: 没有存储。 流不是存储元素

LH is programming hard 2653

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java8新特性stream流操作集合

java8新特性stream流操作集合执行结果 ##Stream流操作集合样例 package com.demo.spring.test; import com.alibaba.fastjson.JSONObject; import com.demo.spring.dto.User; import io.swagger.models.auth.In; import java.util.*; import java.util.stream.Collectors; import java.util.stre

狗狗大蛇 219

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

关于Java8新特性Stream流的集合操作

积累stream常用操作

不知名博客 2160

Java8新特性之Stream流对map集合进行修改并且返回新的map

Stream简介 Java8推出的一个新特性,Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数

qq_38122518的博客 2万+

java8新特性 stream流的方式遍历集合和数组操作

在没有接触java8的时候,我们遍历一个集合都是用循环的方式,从第一条数据遍历到最后一条数据,现在思考一个问题,为什么要使用循环,因为要进行遍历,但是遍历不是唯一的方式,遍历是指每一个元素逐一进行处理(目的),而并不是从第一个到最后一个顺次处理的循环,前者是目的,后者是方式。这个和lambda表达式的延迟加载的原理一样,它可以进行链式编程,比如 ().filter().map().limit(),可以点下去,到最后一步(方法为count或者foreach)加载数据。执行完的结果不能在调用延迟方法。

u010227042的博客 4057

【java8新特性】stream流的方式遍历集合(几个常用用法)

前言: 在没有接触java8的时候,我们遍历一个集合都是用循环的方式,从第一条数据遍历到最后一条数据,现在思考一个问题,为什么要使用循环,因为要进行遍历,但是遍历不是唯一的方式,遍历是指每一个元素逐一进行处理(目的),而并不是从第一个到最后一个顺次处理的循环,前者是目的,后者是方式。 所以为了让遍历的方式更加优雅,出现了流(stream)! stream的方法: 这篇文章主要先讲3个常用的情景: 一:把list里每一个对象的某个属性值取出来放到list中 二:把list里每一个对象的某几..

紫陌520的博客 1万+

Java8新特性之Stream流与集合

流与集合 我们先来打个直观的比方吧。比如说存在DVD里的电影,这就是一个集合(也许是字节,也 许是帧,这个无所谓),因为它包含了整个数据结构。现在再来想想在互联网上通过视频流看同 样的电影。现在这是一个流(字节流或帧流)。流媒体视频播放器只要提前下载用户观看位置的 那几帧就可以了,这样不用等到流中大部分值计算出来,你就可以显示流的开始部分了(想想观 看直播足球赛)。特别要注意,视频播放器可能没有将...

Kevin.wang 969

Java8 新特性 Stream流操作List集合 (一)

import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class Test { public static List<Employee> c..

h_j_c_123的博客 2329
上一篇: SpringBoot项目配置Swagger
下一篇: Linux(centos7)安装Redis
ㅤㅤ 诚ㅤㅤ
博客等级 码龄8年 206粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值