首页 > 其他分享 >stream流学习(二)

stream流学习(二)

时间:2023-07-30 17:01:28浏览次数:34  
标签:stream personList System 学习 person println out

1. foreach 遍历

// void forEach(Consumer<? super T> action);
  personList.stream()
          .forEach(person -> System.out.println("person = " + person));

2. count 统计流中元素个数

//long count();
  long count = personList.stream()
          .count();
  System.out.println("count = " + count);

3. findFirst 查找第一个

// Optional<T> findFirst();
  // 找出年龄大于18的第一个人
  Optional<Person> personFirst = personList.stream()
      .filter(person -> person.getAge() > 18)
      .sorted(Comparator.comparing(Person::getAge))
      .findFirst();
  System.out.println("personFirst.get() = " + personFirst.get());

4. findAny 随机查找一个

// Optional<T> findAny();
  // 提供findAny方法是为了更好的利用并行流
  // 找出年龄大于60的任意一个人
  Optional<Person> any = personList.parallelStream()
          .filter(person -> person.getAge() > 60)
          .findAny();
  
  // 如果any不为空,则执行括号内的语句
  any.ifPresent(person -> System.out.println("person = " + person));
  
  // 判断any是不是空
  if (any.isPresent()){
      System.out.println("any.get() = " + any.get());
  }

5. reduce 将流中的元素组合

// Optional<T> reduce(BinaryOperator<T> accumulator);
  // T reduce(T identity, BinaryOperator<T> accumulator);
  // reduce接受两个参数,一个初始值这里是0,一个 BinaryOperatoraccumulator,来将两个元素结合起来产生一个新值,另外reduce方法还有一个没有初始化值的重载方法。
  // 求和
  Optional<Integer> reduce = personList.stream()
          .map(person -> person.getAge())
          .reduce((age, age2) -> age + age2);
  
  Optional<Integer> reduce1 = personList.stream()
          .map(person -> person.getAge())
          .reduce(Integer::sum);
  
  Integer reduce2 = personList.stream()
          .map(Person::getAge)
          .reduce(0, Integer::sum);
  
  
  // 求最值
  // 找出年龄最大的职员,如果年龄相同,则找出工资最高的
  Optional<Person> reduce3 = personList.stream()
          .reduce((person, person2) -> {
              int compareFlag = person.getAge().compareTo(person2.getAge());
              if (compareFlag == 0){
                  return person.getSalary().compareTo(person2.getSalary())>0?person:person2;
              }
             return compareFlag > 0 ? person : person2;
          });
  
  // 求平均
  // 计算平均薪资
  long count1 = personList.stream().count();
  double sum = personList.stream()
          .mapToDouble(Person::getSalary)
          .reduce(0.0, Double::sum);
  
  System.out.println(String.format("平均薪资为:%1.2f",sum/count1));

6. min/max 获取最小最大值

// 方法参数为 Comparator<?superT>comparator
  // 找出符合判断条件的最大最小数据
  Optional<Person> personMax = personList.stream()
          .max((o1, o2) -> {
              if (o1.getAge().compareTo(o2.getAge()) == 0) {
                  return o1.getSalary().compareTo(o2.getSalary());
              }
              return o1.getAge().compareTo(o2.getAge());
          });
  if (personMax.isPresent()){
      System.out.println("personMax.get() = " + personMax.get());
  }
  
  Optional<Person> personMin = personList.stream()
          .min((o1, o2) -> {
              if (o1.getAge().compareTo(o2.getAge()) == 0) {
                  return o1.getSalary().compareTo(o2.getSalary());
              }
              return o1.getAge().compareTo(o2.getAge());
          });
  if (personMin.isPresent()){
      System.out.println("personMin.get() = " + personMin.get());
  }
  
  // 输出
  // person.get() = StreamTest.Person(name=test08, age=38, salary=4.8)
  // person.get() = StreamTest.Person(name=test03, age=16, salary=0.5)

7. sum / summingxxx 求和

int sumAge = personList.stream()
          .mapToInt(Person::getAge)
          .sum();
  System.out.println("sumAge = " + sumAge);
  
  // 如果数据类型为double、long,则通过summingDouble、summingLong方法进行求和。
  Double sumSalary = personList.stream()
          .collect(Collectors.summingDouble(Person::getSalary));
  System.out.println("sumSalary = " + sumSalary);
  
  // 输出
  // sumAge = 262
  // sumSalary = 18.8

8. averagingxxx 求平均值

Double averSalary = personList.stream()
          .collect(Collectors.averagingDouble(Person::getSalary));
  System.out.println(String.format("averSalary = %3.2f",averSalary));
  // 输出
  // averSalary = 1.88

9. summarizingxxx 同时求总和、平均值、最大值、最小值

DoubleSummaryStatistics summaryStatistics = personList.stream()
          .collect(Collectors.summarizingDouble(Person::getSalary));
  System.out.println("平均值:summaryStatistics.getAverage() = " + summaryStatistics.getAverage());
  System.out.println("最大值:summaryStatistics.getMax() = " + summaryStatistics.getMax());
  System.out.println("最小值:summaryStatistics.getMin() = " + summaryStatistics.getMin());
  System.out.println("总和:summaryStatistics.getSum() = " + summaryStatistics.getSum());
  System.out.println("计数:summaryStatistics.getCount() = " + summaryStatistics.getCount());
  // 输出
  //平均值:summaryStatistics.getAverage() = 1.8800000000000001
  //最大值:summaryStatistics.getMax() = 4.8
  //最小值:summaryStatistics.getMin() = 0.5
  //总和:summaryStatistics.getSum() = 18.8
  //计数:summaryStatistics.getCount() = 10

10. collect 返回集合

Set<Double> salarySet = personList.stream()
          .map(Person::getSalary)
          .collect(Collectors.toSet());
  System.out.println("salarySet = " + salarySet);
  
  List<Person> personList18 = personList.stream()
          .filter(person -> person.getAge() > 18)
          .collect(Collectors.toList());
  System.out.println("personList18 = " + personList18);
  
  // (a,b)->b,如果重复选择后者
  Map<String, Person> personMap = personList.stream()
          .collect(Collectors.toMap(Person::getName, Function.identity(),(a,b)->b));
  System.out.println("personMap = " + personMap);
  
  // 根据某个参数对列表进行去重
  List<ttt> list = new ArrayList<ttt>() {{
      add(new ttt().setName("1").setAge(120));
      add(new ttt().setName("2").setAge(180));
      add(new ttt().setName("2").setAge(18));
      add(new ttt().setName("1").setAge(12));
  }};
  System.out.println("list = " + list);
  System.out.println("***********************************************");
  
  ArrayList<ttt> arrayList = list.stream().collect(
          Collectors.collectingAndThen(
                  Collectors.toCollection(
                          () -> new TreeSet<>(Comparator.comparing(ttt::getName))
                  ), ArrayList::new
          )
  );
  System.out.println("arrayList = " + arrayList);
  System.out.println("=================");

11. joining 拼接流中的元素

// 去除重复的姓名
  String join = personList.stream()
      .map(Person::getName)
      .distinct()
      .collect(Collectors.joining("-"));
  System.out.println("join = " + join);
  // 输出:join = test01-test02-test03-test04-test05-test06-test07-test08

12. groupingBy 分组

// 根据name分组
  Map<String, List<Person>> groupName = personList.stream()
          .collect(Collectors.groupingBy(Person::getName));
  System.out.println("groupName = " + groupName);
  
  // 根据name和age分组
  Map<String, List<Person>> groupNameAge= personList.stream()
          .collect(Collectors.groupingBy(person->person.getName()+"-"+person.getAge()));
  System.out.println("groupNameAge = " + groupNameAge);
  
  // 将成年的按照年龄分组,未成年的分成一组
  Map<String, List<Person>> groupAge = personList.stream()
          .collect(Collectors.groupingBy(person -> {
              if (person.getAge() < 18) {
                  return "未成年";
              } else {
                  return person.getAge() + "岁";
              }
          }));
  System.out.println("groupAge = " + groupAge);

13. partitioningBy 分区

// 分区是特殊的分组,它分类依据是true和false,所以返回的结果最多可以分为两组。
  Map<Boolean, List<Person>> listMap = personList.stream()
          .collect(Collectors.partitioningBy(person -> person.getAge() > 18));
  
  System.out.println("listMap = " + listMap);
  // 将person划分为是否大于18

14.allMatch/anyMatch/noneMatch 匹配

// 是否全部person的age都大于18
boolean matchAll = personList.stream()
        .allMatch(person -> person.getAge() > 18);
System.out.println("matchAll = " + matchAll);
// 是否存在person的age大于18
boolean anyMatch = personList.stream()
        .anyMatch(person -> person.getAge() > 18);
System.out.println("anyMatch = " + anyMatch);
// 是否不存在person的age大于100
boolean noneMatch = personList.stream()
        .noneMatch(person -> person.getAge() > 100);
System.out.println("noneMatch = " + noneMatch);

// 输出
// matchAll = false
// anyMatch = true
// noneMatch = true

标签:stream,personList,System,学习,person,println,out
From: https://blog.51cto.com/u_16155131/6901502

相关文章

  • JavaScript学习 -- 对称加密算法DES
    在现代的互联网时代,数据安全性备受关注。为了保护敏感数据的机密性,对称加密算法是一种常用的方法。在JavaScript中,DES(DataEncryptionStandard)是一种常用的对称加密算法。本篇博客将为您展示如何在JavaScript中使用DES算法进行加密和解密,并提供一个实际的例子。首先,我们需要使用Cr......
  • java学习前须知(笔记)
    Path环境变量的配置我的电脑单击右键选择属性,就进入了设置的关于选项,找到高级系统设置,高级里面选环境变量,弹出窗口里面选系统变量下的新建,取名JAVA_HOME;路径选为jdk-8的根目录,即可得到一个系统变量;选中系统变量里的Path,编辑即可,可新建%JAVA_HOME%\bin,这样就可以直接在cmd里启......
  • python数据分析师入门-学习笔记(第十节 数据获取)
    工具使用Anaconda官网下载安装一路next(默认就行)Chrome默认安装就行打开jupyternotebook打开anacondaprompt输入jupyternotebook系统自动打开一个网页快手掌握开发工具模式:代码模式markdown模式快捷键h查看所有快捷键esc编辑状态切换......
  • 杜教筛学习笔记
    杜教筛杜教筛的基本形式对于积性函数\(g(n)\)我们希望求他的前缀和\(S_g(n)\),如果有另一积性函数\(f(n)\)满足\(f*g=h\),且\(fh\)的前缀和易求,那么我们可以通过\(S_f(n)S_h(n)\)快速的求出\(S_g(n)\)。\[\begin{aligned}S_h(n)&=\sum\limits_{i=1}^n\sum\limits_{d|i}f(d)\cdo......
  • Java学习-4.数组
    一、数组类型数组是存储多个变量(元素)的东西(容器),这多个变量的数据类型要一致。定义一个数组类型的变量,使用数组类型“类型[]”,例如,int[]。和单个基本类型变量不同,数组变量初始化必须使用newint[5]表示创建一个可容纳5个int元素的数组。Java的数组有几个特点:数组所有元素......
  • markdown学习
    markdown学习标题+空格+标题名一级标题+空格+标题名二级标题+空格+标题名三级标题字体斜体加粗加粗斜体划线引用天天向上,好好学习分割线图片超链接百度列表第一第二第三第一第二第三表格姓名性别年龄王肖泽男12施芊伊女14......
  • markdown学习
    markdown学习标题+空格+标题名一级标题+空格+标题名二级标题+空格+标题名三级标题字体斜体加粗加粗斜体划线引用天天向上,好好学习分割线图片超链接百度列表第一第二第三abc表格姓名性别年龄王肖泽男12代码foriinran......
  • Markdown格式学习测试草稿
    Markdown学习标题:二级标题三级标题字体hello,world!hello,world!hello,world!***hello,world!***hello,world!hello,world!引用选择狂神说java,走向人身巅峰分割线图片超链接超链接测试列表ABCACB表格名字性别生日张三男1997.1.1......
  • python数据分析师入门-学习笔记(第九节 爬虫的核心流程)
    学习链接:Python数据分析师入门爬虫的核心流程明确目标汽车成交量汽车评论信息汽车提车分享信息搜寻哪些网站或APP有我们要的资源汽车之家懂车帝易车分析数据所在位置,加载方式直接加载的额外的网络请求数据获取使用代码驱动APP或浏览器自己分析请求......
  • 深度学习基础语法
    深度学习基础-李沐课程跟学数据操作+数据预处理定义一个1-11个数值的一维张量x=torch.arange(12)tensor([0,1,2,3,4,5,6,7,8,9,10,11])通过shape访问张量的形状和张量中元素的总数x.shape元素总数x.numel改变一个张量的形状,但是不改变......