首页 > 编程语言 >Java的Stream流编程的排序sorted方法里参数o1,o2分别代表什么?

Java的Stream流编程的排序sorted方法里参数o1,o2分别代表什么?

时间:2024-10-17 16:34:29浏览次数:9  
标签:Java Stream o2 add User new sorted public o1

先说结论:在sorted方法中,o1是最后面的元素,o2是倒数第二个元素,以此类推,流是处理元素是从后面开始取值。 

  1.   package com.br.itwzhangzx02.learn;
  2.    
  3.    
  4.   import org.junit.Test;
  5.    
  6.   import java.util.ArrayList;
  7.   import java.util.List;
  8.    
  9.   import com.br.itwzhangzx02.learn.POJO.User;
  10.    
  11.   public class StreamTest {
  12.    
  13.   /**
  14.   * 1.id全部满足是偶数
  15.   * 2.年龄大于10
  16.   * 3.用户名大写
  17.   * 4.用户名字母倒排序
  18.   * 5.只输出一个用户名
  19.   *
  20.   *
  21.   * */
  22.   @Test
  23.   public void testStream(){
  24.   List<User> list = new ArrayList<User>(){
  25.   {
  26.   add(new User(1l,"q",10, "清华大学"));
  27.   add(new User(2l,"f",12, "清华大学"));
  28.   add(new User(3l,"b",15, "清华大学"));
  29.   add(new User(4l,"a",12, "清华大学"));
  30.   add(new User(5l,"d",25, "北京大学"));
  31.   add(new User(6l,"c",16, "北京大学"));
  32.   add(new User(7l,"t",14, "北京大学"));
  33.   add(new User(8l,"g",14, "浙江大学"));
  34.   add(new User(9l,"j",17, "浙江大学"));
  35.   add(new User(10l,"l",10, "浙江大学"));
  36.   }
  37.   };
  38.   list.stream()
  39.   .filter(user -> user.getId()%2==0)
  40.   .filter(user -> user.getAge()>10)
  41.   .map(user -> user.getName().toUpperCase())
  42.   .sorted((o1,o2)->{return 1;})
  43.   .forEach(System.out::println);
  44.    
  45.   //sorted 方法中,我们重写compare方法:如果return是1,则是按照原先的排序排。-1则是按照逆序排
  46.   //
  47.   }
  48.   /** a negative integer, zero, or a positive integer as the
  49.   * first argument is less than, equal to, or greater than the
  50.   * second.**/
  51.    
  52.   }
  1.   package com.br.itwzhangzx02.learn.POJO;
  2.    
  3.   public class User {
  4.   public Long getId() {
  5.   return id;
  6.   }
  7.    
  8.   public void setId(Long id) {
  9.   this.id = id;
  10.   }
  11.    
  12.   public String getName() {
  13.   return name;
  14.   }
  15.    
  16.   public void setName(String name) {
  17.   this.name = name;
  18.   }
  19.    
  20.   public Integer getAge() {
  21.   return age;
  22.   }
  23.    
  24.   public void setAge(Integer age) {
  25.   this.age = age;
  26.   }
  27.    
  28.   public String getSchool() {
  29.   return school;
  30.   }
  31.    
  32.   public void setSchool(String school) {
  33.   this.school = school;
  34.   }
  35.    
  36.   private Long id; //主键id
  37.   private String name; //姓名
  38.   private Integer age; //年龄
  39.   private String school; //学校
  40.    
  41.   public User(Long id, String name, Integer age, String school) {
  42.   this.id = id;
  43.   this.name = name;
  44.   this.age = age;
  45.   this.school = school;
  46.   }
  47.   }

一开始的疑惑:

  1.   * @param o1 the first object to be compared.
  2.   * @param o2 the second object to be compared.
  3.   * @return a negative integer, zero, or a positive integer as the
  4.   * first argument is less than, equal to, or greater than the
  5.   * second.
  6.   * @throws NullPointerException if an argument is null and this
  7.   * comparator does not permit null arguments
  8.   * @throws ClassCastException if the arguments' types prevent them from
  9.   * being compared by this comparator.
  10.   */
  11.   int compare(T o1, T o2);

上面是我拿到的Comparator接口中关于,compare方法的注释:

按照规则:第一个参数>第二个参数时,返回的是一个正数,那么返回正数,代表什么?

结论:正数的话,就是保持俩个元素的位置不变,负数的话俩元素位置互换。

首先,我们验证返回正数时,元素位置不变:

 返回为负数时,元素位置互换。比如:F,A--->A,F

sorted()方法,使用的是默认的自然顺序--升序排序。但是,stream中元素,需要实现comparable接口,重写了方法compareTo方法。查看string的这个方法:

  1.   public int compareTo(String anotherString) {
  2.   int len1 = value.length;
  3.   int len2 = anotherString.value.length;
  4.   int lim = Math.min(len1, len2);
  5.   char v1[] = value;
  6.   char v2[] = anotherString.value;
  7.    
  8.   int k = 0;
  9.   while (k < lim) {
  10.   char c1 = v1[k];
  11.   char c2 = v2[k];
  12.   if (c1 != c2) {
  13.   return c1 - c2;
  14.   }
  15.   k++;
  16.   }
  17.   return len1 - len2;
  18.   }

 比较规则很简单,就是从字符数组的char[0]开始,比较二者的值,然后返回 c1-c2.

比如我们的F,A比较的时候,F>A,返回值为正数,根据我们前面的结论,返回一个正数时,顺序是保持不变的才对,那么这里到底是怎么回事?

为了看问题方便,我只保留了F和A的数据,测试如下:

 

按照我们的结论:返回正数时,顺序是不变的,为啥现在顺序变了,而且刚好是逆序。

最后,仔细想是不是,流处理元素的时候顺序的问题。比如:o1代表的是我们的A那个元素,o2代表的是F那个元素。

怎么验证呢?

人为抛异常,先处理的那个元素,最先抛异常

正常我们的数据,在list中是F元素在前,A元素在后。然后我们的代码先,o1转Integer抛错,从异常看,说明o1是A元素。

所以,最后的结论是,o1是A,o2是F。也就是说我们处理流时,不是按我们的list的索引从0开始的处理,而是反向处理的。

另一种论证方式:直接打印出我们的o1和o2

结论:在sorted((o1,o2)->{return o1.compareTo(o2)})这个方法里,我们的参数是从后往前取的。o1是最后一个元素,o2是倒数第二个元素,依次类推。

标签:Java,Stream,o2,add,User,new,sorted,public,o1
From: https://www.cnblogs.com/pqdl4312/p/18472586

相关文章

  • 实验三: JavaScript数组与函数
    实验目的熟练掌握常用JavsScript的数组、自定义函数、作用域。实验内容数组定义及元素获取;数组的遍历;数组内容的增删改查;数组的排序;数组的反转、截取、合并、元素拼接函数的声明;函数的调用;匿名函数;作用域。实验步骤:数组定义及元素获取;数组的遍历;数组内容的增删改查......
  • 面试Java岗老喜欢盯着JVM问,有那么多项目要调优吗?
    性能优化作为一个程序员,性能优化是常有的事情,不管你是刚入行的小白还是已经入坑了很久的小秃头都会经历很多不同层次的性能优化——小到代码审查大到整个系统设计的优化!大势所趋之下,如何让自己的优化方向精准到性能瓶颈的那个点以及尽可能的提高优化的性价比已经慢慢成为每一......
  • java毕业设计-基于Springboot的教学资源共享平台【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、部分代码;5、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:Springboot数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能成绩管理:记录和追踪学生课程成绩,便于......
  • 【关注可白嫖源码】基于Java的智慧诊疗档案管理系统
     摘 要针对医院在线诊疗以及预约挂号等问题,对其进行研究分析,然后开发设计出智慧诊疗档案管理系统以解决问题。智慧诊疗档案管理系统主要功能模块包括预约挂号、取消预约、电子处方、收费查询、服务评价等,本系统采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满......
  • Java 中 MultipartFile 文件校验文件格式
    后台项目经常会有文件上传功能,如果后台不做校验会有用户上传恶意文件,可能会导致上传文件类型不符合要求或者上传恶意脚本的情况导致服务器被攻击。publicstaticvoidmain(String[]args)throwsInterruptedException{byte[]content="Hello,World!".getBytes();......
  • 终于整理完了,全网最全JAVA面试八股文总结!
    1、Java线程具有五中基本状态(1)新建状态(New):当线程对象对创建后,即进入了新建状态,如:Threadt=newMyThread();(2)就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-2-环境准备与搭建-基于Maven(详细
    1.简介上一篇宏哥已经讲解和分享了如何通过引入jar包来搭建Java+Playwright自动化测试环境,这一种是比较老的方法,说白了就是过时的老古董,但是我们必须了解和知道,其实maven搭建无非也就是下载引入相关的jar包,只不过相比之下是简单方便了,了解其本质可以帮助我们更好的学习maven搭建......
  • java毕业设计-基于Springboot的小型企业客户关系管理系统【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、部分代码;5、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:Springboot数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能产品管理:集中维护产品信息,包括添加、......
  • 构建高效在线考试平台:Spring Boot与JavaWeb的融合
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于JavaWeb技术的在线考试系统设计与实现的相关信息成为必然。开发合适的基于JavaWeb技术......
  • Spring Boot驱动的在线考试系统:JavaWeb技术实战
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于JavaWeb技术的在线考试系统设计与实现的相关信息成为必然。开发合适的基于JavaWeb技术......