java8-Stream API(1)

java学习笔记21--JDK1.8之后的新特性 Stream api Stream API 从1.8引入的api, 都和集合有关。这些方法操作集合更方便: 例子:写一个方法找list集合中的所有偶数,并返回一个新的list集合; 代码如下: public class Demo1 { public static void main(String[] args) { // 写一个方法找list集合中的所有偶数,并返回一个新的list集合 ... 阅读详情

概述

了解stream

Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一个则是 Stream API(java.util.stream.*)。
Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之, Stream API 提供了一种高效且易于使用的处理数据的方式。

流(Stream): 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
这里的Stream和IO中的Stream不同,它提供了对集合操作的增强,极大的提高了操作集合对象的便利性。
“集合讲的是数据,流讲的是计算!”

特点

  • Stream 自己不会存储元素;
  • Stream 不会改变源对象; 相反,它们会返回一个持有结果的新Stream;
  • Stream 操作是延迟执行的; 这意味着它们会等到需要结果的时候,才执行;

Stream 操作的三个步骤

  • 创建 Stream
    一个数据源(如: 集合,数组),获取一个流;
    如:可以通过 Collection 集合提供的串行流 stream() 或并行流 parallelStream()
  • 中间操作
    一个中间操作链,对数据源的数据进行处理;
  • 终止操作(终端操作)
    一个终止操作,执行中间操作链,并产生结果;

1.创建stream

1.Collection 扩展接口,提供了两个获取流的方法

  • default Stream<E> stream() : 返回一个顺序流
  • default Stream<E> parallelStream() : 返回一个并行流

2.由数组创建流
Java8 中的 Arrays 的静态方法 stream() 可以获取数组流:

  • static <T> Stream<T> stream(T[] array): 返回一个流

重载形式,能够处理对应基本类型的数组:

  • public static IntStream stream(int[] array)
  • public static LongStream stream(long[] array)
  • public static DoubleStream stream(double[] array)

3.由Stream静态方法创建

  1. 由值创建流 Stream.of()
    可以使用静态方法 Stream.of(), 通过显示值 创建一个流。它可以接收任意数量的参数。
    – public static<T> Stream<T> of(T... values) : 返回一个流
  2. 由函数创建流:无限流 Stream.iterate()或Stream.generate()
    – 迭代:public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)
    – 生成:public static<T> Stream<T> generate(Supplier<T> s)
	@Test
    public void test1(){
        //1通过Collection系列集合提供的stream()或 paralleStream()
        List<String> list = new ArrayList<>();
        Stream stream1 = list.stream();
        Stream stream2 = list.parallelStream();

        //2.通过Arrays中的静态方法stream()
        Employee[] employees = new Employee[8];
        Stream<Employee> stream3 = Arrays.stream(employees);

        //3.通过Stream类的静态放of()、iterate()、generate()创建
        //of
        Stream<String> stream4 = Stream.of("a","b","c");
        //无限流1:iterate
        Stream<Integer> stream5=Stream.iterate(0,x->x+2);
        stream5.limit(5).forEach(x->System.out.print(x)); //02468
        //无限流2:generate
        Stream<Integer> stream6 = Stream.generate(()->(int)(Math.random()*100));
        stream6.limit(6).forEach(x-> System.out.print(x)); 
    }

2.中间操作

筛选与切片

  • filter 接收lambda,从流中排除某些元素
  • limit 截断流,使其元素不穿过给定数量。limit在filter后一起使用可以短路
  • skip(n) 跳过元素,返回一个丢掉前n个元素的流,若流不足n个,返回一个空流,与limit互补
  • distinct 去重,通过元素的hashCode() 和 equals()比较去重

映射

  • map 接收lambda 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成为一个新的元素
  • flatMap 接收一个函数为参数,将流中的每个值换成另一个流,然后把所有的流连接成一个流

排序

  • sorted() 自然排序
  • sorted(Compator com) 定制排序

filter

	/**
     * filter
     * 内部迭代:迭代操作由StreamAPI完成
     */
    @Test
    public void test1(){
        //中间操作 不会执行任何操作
        List<Employee> employees = Lists.newArrayList(new Employee(12, 1000), new Employee(20, 2000));
        Stream<Employee> stream = employees.stream()
                .filter((e) -> {
                    System.out.println("中间操作");
                    return e.getAge() > 13;
                });
        //终止操作 一次性执行全部内容,即“惰性求值”
        stream.forEach(System.out::println); //Employee(age=20, salary=2000)
    }

limit

    /**
     * 截断流 一旦找到满足条件的数据,后续的迭代结束
     */
    @Test
    public void test3(){
        List<Employee> employees = Lists.newArrayList(new Employee(12, 1000), new Employee(20, 2000));
        employees.stream()
                .filter((e)->{
                    System.out.println("短路!");
                    return e.getSalary()>60;
                })
                .limit(1)
                .forEach(System.out::println);
    }
    //短路!
	//Employee(age=12, salary=1000)

skip

    /**
     * 跳过
     */
    @Test
    public void test4(){
        List<Employee> employees = Lists.newArrayList(new Employee(12, 1000), new Employee(20, 2000));
        employees.stream()
                .filter(e->e.getSalary()>60)
                .skip(1)
                .forEach(System.out::println);
        //Employee(age=20, salary=2000)
    }

distinct

    /**
     * 去重 重写hashCode和equals
     */
    @Test
    public void test5(){
        List<String> ss = Lists.newArrayList("a","a","b","c","c");
        ss.stream().distinct()
                .forEach(System.out::print);//abc
    }

map和flapMap

二者区别 https://blog.youkuaiyun.com/andyzhaojianhui/article/details/79047825
类似add于addAll的关系。add参数是集合每个元素,返回至集合。addAll参数是整个集合,实际操作是加入的集合中每个元素,返回至集合。

map
map的返回结果:取决于map中的函数返回类型,返回结果是什么就是什么,再加上外层的Stream

    //map
    @Test
    public void test6(){
        /**
         * map
         */
        List<String> list = Arrays.asList("a","b","c");
        System.out.println(list); //[a, b, c]
        //将list中的每个元素转换成数字
        Stream<Integer> stream = list.stream().map(s->{
            Integer i;
            switch (s){
                case "a":i=1;break;
                case "b":i=2;break;
                case "c":i=3;break;
                default:i=0;
            }
            return i;
        });
        stream.forEach(System.out::print); //123
    }

flatMap在取深层元素时很有用。
flatMap的返回结果中,两层Sream包裹的仅保留一层Stream,并去掉集合的一层。
作用1:【输入】将输入去掉一层集合后返回 借助u->u.stream()

    //map与flatMap对比
    @Test
    public void test7(){
        /**
         * flatMap
         */
        List<String> l1= Arrays.asList("a","b","c");
        System.out.println(l1);//[a, b]
        List<String> l2= Arrays.asList("x","y");
        System.out.println(l2);//[x, y]

        //map
        Stream<List<String>> s =Stream.of(l1,l2);
        //map的返回结果:取决于map中的函数返回类型,返回结果是什么就是什么,再加上外层的Stream
        Stream<List> s1 = s.map(li -> Lists.newArrayList(li,"1"));
        s1.forEach(System.out::println); //[[a, b, c], 1][[x, y], 1]

        //flatMap
        Stream<List<String>> ss =Stream.of(l1,l2);
        //flatMap作用1:将输入去掉一层后返回
        Stream<String> s2 = ss.flatMap(u->u.stream());
        s2.forEach(System.out::print);

        //测试多层Stream和List的情况:仅保留一层Stream并去掉集合的一层
        List<List<String>> lists = Lists.newArrayList();
        List<String> ls1=Lists.newArrayList("didi");
        List<String> ls2=Lists.newArrayList("hi","my");
        lists.add(ls1);
        lists.add(ls2);
        System.out.println(lists); //[[didi], [hi, my]]
        Stream<List<List<String>>> si = Stream.of(lists);
        Stream<List<String>> s3 = si.flatMap(u->u.stream());
        s3.forEach(System.out::print); //[didi][hi, my]  由此可见仅去掉了一层
    }

作用2:【输出】flatMap中的函数返回,如果也是Stream,则仅保留一层stream

    // flatMap的返回结果测试
    public  Stream<Character> characterStream(String s) {
        List<Character> result = new ArrayList<>();
        for (char c : s.toCharArray())
            result.add(c);
        return result.stream();  //list转stream,一个级别上
    }
    @Test
    public void test8(){
        List<String> words = new ArrayList<String>();
        words.add("your");
        words.add("name");
        Stream<Stream<Character>> result1 = words.stream().map(this::characterStream);
        //测试map
        result1.forEach(System.out::println);//打印的是两个Stream对象
        //java.util.stream.ReferencePipeline$Head@12bb4df8
        //java.util.stream.ReferencePipeline$Head@4cc77c2e
        Stream<Character> result2 = words.stream().flatMap(this::characterStream);
        //测试flatMap
        result2.forEach(System.out::println); //一个个的字符
    }

flatmap示例2:

    @Test
    public void testMapAndFlatMap() {
        List<String> words = new ArrayList<String>();
        words.add("hello");
        words.add("word");

        //将words数组中的元素再按照字符拆分,然后字符去重,最终达到["h", "e", "l", "o", "w", "r", "d"]
        //如果使用map,是达不到直接转化成List<String>的结果
        List<String> stringList = words.stream()
                .flatMap(word -> Arrays.stream(word.split("")))
                .distinct()
                .collect(Collectors.toList());
        stringList.forEach(e -> System.out.println(e));
    }

sorted() 自然排序(Comparable)
sorted(Compator com) 定制排序 (Comparator)

     List<String> list = Arrays.asList("bbb","zzz","yyy","ccc","sss");

     list.stream()
         .sorted()
         .forEach(System.out::println);

    // 员工排序
    employees.stream()
             .sorted((e1,e2) -> {
                if(e1.getAge().equals(e2.getAge())){
                    return e1.getName().compareTo(e2.getNme());
                }else{
                    return e1.getAge().compareTo(e2.getAge());
                }
             }).forEach(System.out::println);

3.终止操作

终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如:List、Integer,甚至是 void 。

查找与匹配

  • 查找与匹配
  • allMatch 检查是否匹配所有元素
  • anyMacth 检查是否至少匹配一个元素
  • noneMacth 检查是否没有匹配所有元素
  • findFirst 返回第一个元素
  • findAny 返回任意一个元素
  • count 返回元素总数
  • max 返回最大值
  • min 返回最小值
  • forEach 内部迭代(使用 Collection 接口需要用户去做迭 代,称为外部迭代。相反,Stream API 使用内部 迭代——它帮你把迭代做了)

归约

  • reduce(T identity,BinaryOperator) 可以将流中元素反复结合起来,得到一个值。 返回 T
  • reduce(BinaryOperator) 可以将流中元素反复结合起来,得到一个值。 返回 Optional

收集

  • collect(Collector c) 将流转换为其他形式。接收一个 Collector接口的 实现,用于给Stream中元素做汇总的方法

备注:map 和 reduce 的连接通常称为 map-reduce 模式,因 Google 用它 来进行网络搜索而出名

查找匹配demo

    @Test
    public void test1(){
        boolean b1 = studentList.stream()
                .allMatch((e) -> e.getStatus() == Student.Status.FREE);
        System.out.println(b1);
 
        boolean b2 = studentList.stream()
                .anyMatch((e) -> e.getStatus() == Student.Status.FREE);
        System.out.println(b2);
 
        boolean b3 = studentList.stream()
                .noneMatch((e) -> e.getStatus() == Student.Status.FREE);
        System.out.println(b3);
 
        Optional<Student> op1 = studentList.stream()
                .sorted((e1, e2) -> -Integer.compare(e1.getScore(), e2.getScore()))
                .findFirst();
        System.out.println(op1.get());
 
        Optional<Student> op2 = studentList.stream()
                .filter((e) -> e.getStatus() == Student.Status.FREE)
                .findAny();
        System.out.println(op2.get());
        //并行流
        Optional<Student> op3 = studentList.parallelStream()
                .filter((e) -> e.getStatus() == Student.Status.FREE)
                .findAny();
        System.out.println(op3.get());
        //count
        long count = studentList.stream()
                .count();
        System.out.println(count);
        //max
        Optional<Student> max = studentList.stream()
                .max(Comparator.comparing(Student::getName));
        System.out.println(max.get());
        //min
        Optional<Integer> min = studentList.stream()
                .map(e -> e.getScore())
                .min(Integer::compare);
        System.out.println(min.get());
 
    }

reduce

    //reduce
    @Test
    public void test9(){
        /*
         * 归约
         *   reduce(T identity, BinaryOperator) / reduce(BinaryOperator)
         *     可以将流中元素反复结合起来,得到一个值; 其中 第一个参数identity,表示起始值
         */
        // 需求: 将list集合中的元素相加
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        Integer sum = list.stream()
                .reduce(0,(x,y) -> x+y);
        System.out.println(sum); //55

        List<Employee> employees = Lists.newArrayList(new Employee(12, 1000), new Employee(20, 2000));
        // 获取员工工资的总和
        Optional<Integer> op = employees.stream()
                .map(Employee::getSalary)
                .reduce(Integer::sum);
        System.out.println(op.get()); //3000
    }

collect
Collector 接口中方法的实现决定了如何对流执行收集操作(如收 集到 List、Set、Map)。但是 Collectors 实用类提供了很多静态 方法,可以方便地创建常见收集器实例,具体方法与实例如下表:

    //collect
    @Test
    public void test10(){
        /*
         * 收集
         *   collect: 将流转换为其他形式,接收一个Collector 接口的实现,用于给 Stream 中元素做汇总的方法
         *          Collector 接口中方法的实现决定了如何对流执行收集操作(如收集到 List, Set, Map)
         *          Collectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例;
         */
        List<Employee> employees = Lists.newArrayList(new Employee(12, 1000), new Employee(20, 2000));

        // 需求: 将员工中年龄收集到 list 集合
        List<Integer> list = employees.stream()
                .map(Employee::getAge)
                                 .collect(Collectors.toList());
        list.forEach(System.out::println);

        // 将员工姓名收集到 HashSet 中
        HashSet<Integer> hset = employees.stream()
                .map(Employee::getAge)
                .collect(Collectors.toCollection(HashSet::new)); //toSet()
        // 员工总人数
        Long count = employees.stream()
                .collect(Collectors.counting());
        System.out.println("总数"+count);

        // 工资平均值
        Double avg = employees.stream()
                .collect(Collectors.averagingDouble(Employee::getSalary));
        System.out.println("平均"+avg);

        // 工资总和
        Double sum = employees.stream()
                .collect(Collectors.summingDouble(Employee::getSalary));
        System.out.println("综合"+sum);

        // 按照Status进行分组
//        Map<Status, List<Employee>> map = employees.stream()
//                .collect(Collectors.groupingBy(Employee::getStatus));
//        System.out.println(map);

        // 分区(满足条件的一个区,不满足条件的在另一个区)
        Map<Boolean, List<Employee>> map = employees.stream()
                .collect(Collectors.partitioningBy((e) -> e.getSalary() > 1700));
        System.out.println(map); //{false=[Employee(age=12, salary=1000)], true=[Employee(age=20, salary=2000)]}

        DoubleSummaryStatistics dss = employees.stream()
                .collect(Collectors.summarizingDouble(Employee::getSalary));

        System.out.println(dss.getSum());
        System.out.println(dss.getAverage());
        System.out.println(dss.getMax());

        // 连接字符串
//        String str = employees.stream()
//                .map(Employee::getName)
//                .collect(Collectors.joining(","));
//        System.out.println(str);
    }

其他demo。参考 https://blog.youkuaiyun.com/keepstrong/article/details/80154295
分组

 /**
     * 分组
     */
    @Test
    public void test5(){
        Map<Student.Status, List<Student>> map = studentList.stream()
                .collect(Collectors.groupingBy(Student::getStatus));
        System.out.println(map);
    }
    @Test
    public void test6(){
        Map<Student.Status, Map<String, List<Student>>> map = studentList.stream()
                .collect(Collectors.groupingBy(Student::getStatus, Collectors.groupingBy((e) -> {
                    if (e.getAge() < 15) {
                        return "小朋友";
                    } else {
                        return "青年";
                    }
                })));
        System.out.println(map);
    }

分区

 @Test
    public void test7(){
        Map<Boolean, List<Student>> map = studentList.stream()
                .collect(Collectors.partitioningBy((e) -> e.getScore() > 70));
        System.out.println(map);
    }

统计

   @Test
    public void test8(){
        IntSummaryStatistics iss = studentList.stream()
                .collect(Collectors.summarizingInt(Student::getScore));
        System.out.println(iss.getSum());
        System.out.println(iss.getAverage());
        System.out.println(iss.getCount());
        System.out.println(iss.getMax());
    }

拼接

    @Test
    public void test9(){
        String str = studentList.stream()
                .map(Student::getName)
                .collect(Collectors.joining(","));
        System.out.println(str);
    }







浅析Java8中的Stream API (1) Stream API Stream API是什么? Stream API是Java8类库的核心,它能够应用在一组元素上一次执行的操作序列。Stream操作分为中间操作(StatelessOP、StatefulOP)或者最终操作(TerminalOP)两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,这样你我们就可以将多个操作串起来。 使用Stream的时候需要指定一个... 阅读详情

相关推荐

【Stream API笔记01】JDK1.8新特性之Stream API中常见的方法及其使用方式

Stream是JDK1.8新增的一个特性,它是一个位于【java.util.stream】包下面的接口,接口中定义了用于操作数据的公共方法,Stream被称作:【流】,它的意图就是可以按照流的方式对数据进行一些加工处理,实际开发里面最常见的就是操作集合数据,通过Stream API可以编写很少的代码就完成某一个功能,相比于传统的集合处理方式,Stream API显示更加的优雅、高效。Java中可以将Stream API方法大致分为两类,分别是:【中间方法】和【终端方法】。

✅ Java 开发工程师 1185

java.util.list 报错_cannot be cast to java.util.List

java.lang.ClassCastException: [Ljava.lang.Long; cannot be cast to java.util.List1. 使用人人安全框架,发现java.util.List报错信息### The error may involve io.renren.modules.job.dao.ScheduleJobDao.updateBatch### The er...

weixin_39678451的博客 9471

AutoCAD Plant 3D自定义零件库实战:手把手教你用Python创建参数化槽式三通

本文详细介绍了如何利用Python脚本在AutoCAD Plant 3D中创建参数化槽式三通组件,从API原理到实战开发,帮助用户构建高效的自定义零件库。通过Python装饰器系统控制零件属性和行为,实现几何建模、参数管理和规格编辑器集成,提升工业管道设计的标准化和效率。

weixin_28267011的博客 330

解决String cannot be cast to java.util.List报错

string类型转list实体类集合 controller层用@RequestParam Map<String, Object> params接收前端传值,例如 @RequestMapping("/test") public List<Entity> tset(@RequestParam Map<String, Object> params){ List<Entity> list= (List<Entity>) params.ge

xy631739211的博客 2万+

保姆级教程:在S32DS 3.4上安装S32K3xx RTD 4.4驱动包(附常见安装失败排查)

本文提供在S32DS 3.4上安装S32K3xx RTD 4.4驱动包的详细教程,涵盖环境准备、分步安装指南及常见问题排查。特别针对NXP S32K3系列MCU开发者,解决网络问题、路径配置等安装难点,并分享进阶配置技巧和最佳实践,助力高效开发。

weixin_42696271的博客 287

《深入浅出多模态》(二):多模态任务及数据集介绍

本文为《深入浅出多模态》系列第二章,《多模态任务介绍与背景》主要介绍多模态模型的概念、技术难点、下游任务(Visual Grounding、VQA、image/Video Captioning等)及各类应用方向数据集展开介绍,本专栏适合从事多模态小白及爱好者学习,欢迎大家关注,如有侵权请联系删除!

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 3834

解决java.util.HashSet cannot be cast to java.util.List

这样强制转换编译会提示Unchecked cast: ‘java.lang.Object’ to ‘java.util.List’,编译器的意思该强制类型转换并未做类型校验,强制转换并不安全,可能会抛出异常导致程序崩溃。想把它转换为List,如果直接用了强转 List values = (List) map1.values(),就会报错。它接受两个参数,一个是obj,即是我们需要转换的List对象,然后传入List中元素的class即可。

恒二哥的博客 6324

闲鱼爬虫实战:模拟手机端破解反爬策略,爬取指定商品搜索数据,爬取闲鱼搜索指定商品(需手机端模拟)o 技术点:抓包分析、cookie与token

技术点作用抓取手机 App 请求,分析 API 结构、Header、参数加密情况requestsPython 中最常用的 HTTP 库,用于发送模拟请求Session 对象自动管理 Cookie,保持会话User-Agent & 设备特征模拟手机型号、系统版本,绕过服务端检测闲鱼部分接口存在签名,需要逆向或复用有效 Token多线程/异步提高爬取效率(需节制,避免封 IP)解析 HTML 或 JSON 数据注意:闲鱼的接口加密程度中等偏上,部分接口存在动态签名(如x-signx-mini-wua。

2201_76125261的博客 712

java.lang.ClassCastException: java.lang.String cannot be cast to java.util.List

报错: 原因: 解决:

四水六年的博客 9045

【XCharts插件】3-1、制作图表及代码生成图表(v1.0)

XCharts插件是一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。【Unity3D插件】XCharts插件完全教程《全网最全》-专栏文章目录OK,这是v1.0版本的XCharts插件的创建图表,代码生成图表的教程。可能有人要问了,既然都更新到v3.0了,还写啥v1.0教程呢。因为有些项目就是用v1.0去制作图表了,也没有太多的精力去更新插件,所以就一直用的v1.0,而且v1.0已经能实现大部分的图标样式了,所以,博主还是单独写了一篇文章来介绍v1.0的功能。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1293

Autodesk Revit软件二次开发:Revit二次开发中的插件设计与实现

在 Revit 中,族是构成建筑模型的基本单元,可以是门窗、家具等。通过自定义族,可以创建符合特定需求的建筑构件。参数化设计允许族的尺寸、形状等属性根据参数变化而变化。使用 Revit API 创建自定义族涉及多个步骤,包括定义族类型、设置参数、创建几何形状等。// 创建族文档// 定义参数Parameter param = family.FamilyManager.AddParameter("Width", BuiltInParameterGroup.PG_LENGTH, "宽度");

kkchenjj的博客 2229

java8的stream_java8中Stream的使用示例教程

前言Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作。本文将给大家详细介绍关于java8 Stream使用的相关内容,下面话不多说了,来一起看看详细的介绍吧1. 原理Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用...

weixin_39867594的博客 223

YOLO26涨点改进 | 检测头改进篇 | 利用ASFF改进YOLO26检测头,自适应空间特征融合模块,在所有的目标检测上均有大幅度的涨点效果

本文提出了一种自适应空间特征融合(ASFF)检测头YOLO26,用于解决目标检测中特征金字塔跨尺度特征不一致的问题。ASFF通过学习空间权重图,自适应地融合不同尺度的特征,抑制特征层间的冲突信息。实验表明,该方法在MSCOCO数据集上显著提升了检测精度(45FPS下AP达42.4%),且仅引入极小推理开销。ASFF模块具有可微分性、模型无关性和计算成本低等优势,能够有效改善特征尺度不变性,实现速度与精度的良好平衡。文章详细介绍了ASFF的原理、实现代码及其在YOLO模型中的集成方法。

Ai缝合怪、助力小伙伴高效发论文 547

Java——JDK1.8 新增的日期时间API、Stream流API

一、

panda_burn的博客 422

Cursor使用教程:用 Cursor 创建第一个 Java 项目

Cursor是一款基于VS Code的AI编程编辑器,专为开发者设计。安装前需确保JDK 8+、Maven 3.8+等环境配置,支持Windows系统。编辑器提供中文界面选项,可通过扩展市场安装语言包。创建Java项目支持手动和AI提示词两种方式:手动需创建目录结构并编写代码;AI方式则通过自然语言描述快速生成项目框架和代码。标准Java项目包含src/main/java主代码目录、src/test/java测试目录及pom.xml等配置文件。Maven项目中,pom.xml是核心配置文件,管理项目依赖与构

博客 3547

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java基础之Stream API(1.8新特性)

Stream API(1.8新特性) Stream API:  是Java1.8以后出现的新特性,是为了使程序员能更加方便的编程,通常结合lambda使用。 把数据以一种流的方式,给流内的数据提供各种接口和方法,根据不同的需求,自己组合使用接口和方法。 Stream API中由一个重要思想,流水线思想(Pipeline)就是流中的数据是一个接一个的进行处理的,而且原始数据不会改变,还会保...

wanglulu12138的博客 504

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Java没基础】JDK1.8 中的 Lambda 表达式与 Stream API

说起 Lambda 就不得不说这样的一个概念:函数式编程 函数式编程是一种思想,是一个大的概念。 对于函数式编程,有个比较浅显易懂的定义是这样的: 在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值

一步一个脚印 535

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java jdk1.8新特性 Lambda表达式 Stream流 新日期API

Lambda表达式 是替代接口的写法,只能用于接口 ()->{} 实例化接口 创建了一个LambdaEL$1的类,实现了接口 实例化LambdaEL$1的类,类会越来越多 匿名内部类 临时使用 有很多垃圾类 Lambda表达式 可以解决这个问题 Lambda表达式基于函数式编程 函数式写法 方法的参数作为自变量 所有的接口都可以实现函数式编程 可以使用函数的写法来代替接口中方法的写法 (自...

tcbdbd的博客 484

Java8 Stream API学习案例1

1,flatMap 详解,注意IDEA后面的类型提示 map-flatmap 操作 但是二段map-map操作效果 package model; import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists; import java.io.*; import java.nio.file....

qq_15652607的博客 313

【Java面试系列】JDK 1.8 新特性之 Stream API

Java 8 引入了全新的 Stream API,这里的 Stream 和 I/O 流不同,它更像具有 Iterable 的集合类,但行为和集合类又有所不同。Stream 是 Java 8 的新特性,是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的聚合操作(aggregate operation)或者大批量数据操作。Stream 是用函数式编程方式在集合类上进行复杂操作的工具,开发者可以更容易地使用 Lambda 表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等。

网络冒险家 1553

java1.8新特性 Stream API的使用

流(Stream) 到底是什么呢?是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。集合讲的是数据流讲的是计算!注意Stream 自己不会存储元素。Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

qq_61068952的博客 1048

Java8新特性——【1】Stream API

Stream API提供了一种全新的方式来操作集合数据,代码更简洁、可读性更强,并且支持并行操作,可以大大提高开发效率。它的核心思想是将操作分成多个步骤,通过链式调用来逐步处理数据,最后通过终端操作触发计算。结合惰性求值和并行计算,Stream API 能够在不牺牲性能的情况下简化代码。中间操作:如filter()map()distinct(),是惰性求值的,可以连续链式调用。终端操作:如collect()reduce()forEach(),触发计算并返回最终结果。并行流:通过。

Limia40的博客 717

java8 (jdk 1.8) 新特性——Stream ApI

简单来说就是一个类库,里边有一些方法方便我们对集合数据进行操作,就好像使用 SQL 语句进行操作数据库一样优点就是,使我们代码简洁更高效的处理数据,高效!!官方java8 Api中文文档 在公众号内 回复关键字 【文档】 获取一个完成的stream 流操作包含以下内容一个数据源,数据源可以是集合,数组中间链的操作 (比如 过滤, 去重,排序 等等)终止操作,产生一个结果(比如重新收集成集合)userInfoList . add(new UserInfo(1 , "张三" , 23));

从零开始的博客 720

(java1.8)-Stream API 常用方法及例子

3. Stream API:         数据渠道,主要是操作数据源(集合,数组等),进行中间操作,获取结果 【特点】:             A:Stream本身不存储任何的元素。             B:Stream只

假人一个的博客 964

java 1.8.091_Java 8 Stream API 入门者教程

Java 8 给我们带来了一个新功能,也就是本文要介绍的 Stream API,它可以让我们以一种声明的方式处理数据。Stream 使用一种类似用 SQL 的语法来提供一种对 Java 集合运算和表达的高阶抽象。极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。本文是如果想及时了解Spark、Hadoop或者HBase相关的文章,欢迎关注微信公众帐号:iteblog_had...

weixin_39955418的博客 263

Java1.8新特性之Stream的使用

JAVA1.8新特性Stream API的简单使用 list.stream()和list.parallelStream()的区别:stream(),单线程操作,虽然Stream API支持多线程操作集合,但是普通的stream()并没有提供多线程操作,实质上还是串行运行,对于遍历集合来说,它和迭代器,for循...

小小史莱姆的博客 1175
上一篇: java8-lambda(4)方法引用与构造器引用
下一篇: Spring相关问题记录
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值