IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Stream流的这些操作,35岁程序员的人生感悟 -> 正文阅读

[Java知识库]Stream流的这些操作,35岁程序员的人生感悟

}

}


**运行截图**:

![](https://upload-images.jianshu.io/upload_images/22932333-ac0ba36703ad6039.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

distinct:筛选重复的元素,通过流生产元素的hashCode()和equals去除重复元素;

package com.ysh.review01_Stream;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

public class StramTest02 {
public static void main(String[] args) {
Employee employee01=new Employee(“yang”,“hui”,9);
Employee employee02=new Employee(“yang”,“hui”,49);
Employee employee03=new Employee(“yang”,“hui”,9);
Employee employee04=new Employee(“yang”,“hui”,89);
Employee employee05=new Employee(“yang”,“hui”,89);
Employee employee06=new Employee(“yang”,“hui”,89);
List list= Arrays.asList(employee01,employee02,employee03,employee04,employee05,employee06);
//创建Stream
Stream stream1 = list.stream();
//对stream1流进行过滤
Stream s = stream1.filter((e) -> {
System.out.println("---------------filter------------");
//过滤掉年龄小于19
return e.getAge() >= 19;
}).skip(2).distinct();
//s=s.skip(5);
s.forEach((e-> System.out.println(e)));
}
}


**运行截图:**

![](https://upload-images.jianshu.io/upload_images/22932333-e605ba2264502e7c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**排序**:

sorted(Comparable)–自然排序

package com.ysh.review01_Stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamTest03 {
public static void main(String[] args) {
List list= Arrays.asList(“c”,“bbb”,“abc”,“bbbb”);
Stream stream = list.stream();
//即通过调用String方法中CompareTo,通过一个一个的比较字符的ASCLL值,首先比较首字符的ASCLL大小,相同的话再比较下一个
stream= stream.sorted();
stream.forEach(System.out::println);
}
}


**sorted(Comparator)–定制排序**

package com.ysh.review01_Stream;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

public class StramTest02 {
public static void main(String[] args) {
Employee employee01=new Employee(“yang”,“哈哈”,19);
Employee employee02=new Employee(“yang”,“hui”,49);
Employee employee03=new Employee(“yang”,“hui”,79);
Employee employee04=new Employee(“yang”,“呵呵呵”,79);
Employee employee05=new Employee(“yang”,“hui”,39);
Employee employee06=new Employee(“yang”,“hui”,29);
List list= Arrays.asList(employee01,employee02,employee03,employee04,employee05,employee06);
//创建Stream
Stream stream1 = list.stream();
//对stream1流进行过滤
Stream s = stream1.filter((e) -> {
System.out.println("---------------filter------------");
//过滤掉年龄小于19
return e.getAge() >= 19;
});
//s=s.skip(5);
/*此处可以使用Lambda表达式,即s.sorted((o1,o2)->{
//升序排序,如果年龄相同,则按照姓名的长度排序
if (o1.getAge()==o2.getAge()){
return o1.getName().length()-o2.getName().length();
}
//按照年龄升序排序
return o1.getAge()-o2.getAge();

                      })

     */
    s=s.sorted(new Comparator<Employee>() {
        @Override
        public int compare(Employee o1, Employee o2) {
            //升序排序,如果年龄相同,则按照姓名的长度排序
            if (o1.getAge()==o2.getAge()){
                return o1.getName().length()-o2.getName().length();
            }
            //按照年龄升序排序
            return o1.getAge()-o2.getAge();
        }
    });
    s.forEach((e-> System.out.println(e)));
}

}


## Stream中的map和flatMap方法:

*   流中的每一个数据,当做map方法的参数(接口),接口中抽象方法的参数,进行制定操作,最终得到一个结果,最后所有的结果返回去成为一个流
*   流中的每一个数据当作参数,进行操作,得到的结果必须是一个流,最终会结合成一个流返回

package com.ysh.review01_Stream;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class StreamTest04 {
public static void main(String[] args) {
Stream stream=Stream.of(“aaa”,“bbbb”,“ccccc”);
//map方法是每一个数据当作一个流,即以上{aaa}、{bbbb}、{ccccc}各是一个Stream流集合,即达到得到多个Stream流集合
//可以理解为Stream流中包含Stream流
//因为这里的testCharacter()的方法我返回的是一个Stream
//Stream<Stream> streamStream = stream.map((e) -> testCharacter(e));
Stream<Stream> streamStream = stream.map((e) -> {
List list = new ArrayList<>();
for (Character c : e.toCharArray()) {
list.add?;
}
return list.stream();
});
streamStream.forEach((e)->{
e.forEach((e2)->{
System.out.println(e2);
});
});
Stream stm=Stream.of(“aaa”,“bbbb”,“ccccc”);
//flatMap()方法即是把将得到的多个Stream流集合合并为一个一个Stream流集合
Stream stream1=stm.flatMap(StreamTest04::testCharacter);
//streamStream.forEach(System.out::println);
System.out.println("---------------");
stream1.forEach(System.out::println);
}
//返回一个Stream
public static Stream testCharacter(String str){
List list=new ArrayList<>();
for (Character c:str.toCharArray()){
list.add?;
}
Stream stream=list.stream();
return stream;
}
}


## 终止操作

#### 查找与匹配

*   allMatch:检查是否匹配所有元素;
*   anyMatch:检查是否至少匹配一个元素;
*   noneMatch:检查是否没有匹配所有元素;
*   findFirst:返回第一个元素;
*   findAny:返回当前流中的任意元素;
*   count:返回流中元素的总个数;
*   max:返回流中最大值;
*   min:返回流中最小值;

**代码实例**:

package com.ysh.review01_Stream;

import java.util.Optional;
import java.util.stream.Stream;

/**

  • Stream中的终止操作
    */
    public class StreamTest06 {
    public static void main(String[] args) {
    //获取Stream
    Stream stm1=Stream.of(“aaaaaa”,“bbbbb”,“cccccc”,“dd”,“eee”);
    //allMatch()方法里面的参数是一个断言式接口,即实现必须重写test()方法
    boolean b1 = stm1.allMatch((t) -> {
    //检查是否匹配所有元素
    return t.length() > 2;
    });
    Stream stm2=Stream.of(“aaaaaa”,“bbbbb”,“cccccc”,“dd”,“eee”);
    boolean b2=stm2.anyMatch((t) -> {
    //检查是否至少匹配一个元素
    return t.length() > 2;
    });
    Stream stm3=Stream.of(“aaaaaa”,“bbbbb”,“cccccc”,“dd”,“eee”);
    boolean b3=stm3.noneMatch((t) -> {
    //检查是否没有匹配所有元素
    return t.length() > 2;
    });
    Stream stm4=Stream.of(“aaaaaa”,“bbbbb”,“cccccc”,“dd”,“eee”);
    //得到流中的第一个元素
    Optional first = stm4.findFirst();
    //输出
    System.out.println(first.get());
    Stream stm5=Stream.of(“aaaaaa”,“bbbbb”,“cccccc”,“dd”,“eee”);
    //返回当前流中的任意元素
    Optional any = stm5.findAny();
    System.out.println(any.get());
    Stream stm6=Stream.of(“aaaaaa”,“bbbbb”,“cccccc”,“dd”,“eee”);
    //放回流中元素的总个数
    long count = stm6.count();
    System.out.println(count);
    Stream stm7=Stream.of(“aaaaaa”,“bbbbb”,“cccccc”,“dd”,“eee”);
    //返回流中最大值,即长度最长,长度相同则比较ASCLL值大小
    Optional max = stm7.max((s1, s2) -> {
    if (s1.length()==s2.length()){
    return s1.compareTo(s2);
    }
    return s1.length() - s2.length();
    });
    System.out.println(max.get());
    Stream stm8=Stream.of(“aaaaaa”,“bbbbb”,“cccccc”,“dd”,“eee”);
    //返回流中最小值,即长度最短,长度相同则比较ASCLL值大小
    Optional min = stm8.min((s1, s2) -> {
    if (s1.length() == s2.length()) {
    return s2.compareTo(s1);
    }
    return s1.length() - s2.length();
    });
    System.out.println(min.get());
    System.out.println(b3);
    }
    }

## 收集:

收集-将流转换为其他形式,接收一个Collertor接口的实现,用于给Stream中元素做 汇总的方法

*   List:把流中所有元素收集到List中,使用.collect(Collectors.toList());
*   Set:把流中所有元素收集到Set中,删除重复项,使用.collect(Collectors.toSet());
*   Map:把流中所有元素收集到Map中,当出现相同的key时会抛异常,使用 .collect(Collectors.toMap());
*   使用collect方法求流中共有几条数据,使用.collect(Collectors.counting())
*   使用collect方法求平均数,使用.collect(Collectors.averagingInt();
*   使用collect方法求某个变量的总和,使用.collect(Collectors.summingDouble());
*   使用collect方法且某个变量中值的最大值,使用.collect(Collectors.maxBy());

**代码实例**:

package com.ysh.review01_Stream.one;

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

public class StreamTest07 {
public static void main(String[] args) {
Student stu1=new Student(“1”,“hhhh”,18);
Student stu2=new Student(“2”,“hhhhh”,19);
Student stu3=new Student(“3”,“oooooo”,19);
Student stu4=new Student(“4”,“aaaaa”,19);
List list = Arrays.asList(stu1,stu2,stu3,stu4);
//获取所有学生的姓名流,并且存储再List集合中
List collect = list.stream().map((e) -> {
return e.getName();
}).collect(Collectors.toList());
System.out.println(collect);
Set set = list.stream().map((e) -> {
return e.getName();
}).collect(Collectors.toSet());
System.out.println(collect);
//将学生的姓名和年龄放入到一个集合中,当出现相同的key是会抛出一个java.lang.IllegalStateException: Duplicate key异常
Map<String, Integer> map = list.stream().collect(Collectors.toMap((e) -> e.getName(), (e2) -> e2.getAge()));
System.out.println(map);
//运用collect输出所有学生的总数
Long count2 = list.stream().collect(Collectors.counting());
System.out.println(count2);
//运用collect方法计算所有学生的平均年龄
Double collect1 = list.stream().collect(Collectors.averagingDouble((n) -> n.getAge()));
System.out.println(collect1);
//运用collect方法求所有学生的年龄之和
int agesum=list.stream().collect(Collectors.summingInt((e)->e.getAge()));
System.out.println(agesum);
//运用collect方法求所有学生中年龄最大的
Optional max2 = list.stream().collect(Collectors.maxBy((a1, a2) -> a1.getAge() - a2.getAge()));
System.out.println(max2.get());

}

}
class Student {
private String id;
private String name;
private int age;
public Student(){

}

public Student(String id, String name, int age) {
    this.id = id;
    this.name = name;
    this.age = age;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;

最后

小编精心为大家准备了一手资料

**点击这里免费领取**以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍赠送

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

BATJ面试要点及Java架构师进阶资料

片转存中…(img-nxAVeR5E-1628591946517)]

**点击这里免费领取**以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍赠送

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

[外链图片转存中…(img-mcq0MF0T-1628591946520)]

BATJ面试要点及Java架构师进阶资料

[外链图片转存中…(img-5KYGxNCV-1628591946524)]

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:06:27  更:2021-08-11 12:09:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 7:01:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码