jdk都出到16了8还没掌握吗?挽周带你玩转java8新特性(建议收藏)(三)

简介: jdk都出到16了8还没掌握吗?挽周带你玩转java8新特性(建议收藏)(三)

  • Stream 中间操作

多个中间操作可以连接起来形成一个 “流水线” ,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次全部处理,成为 “惰性求值”。

筛选与切片方法 描述
filter(Predicate p) 接收Lambda,从流中排除某些元素
distinct() 筛选,通过流所产生元素的 hashCode() 和 equals() 去除重复元素
limit(long maxSize) 截断流,使其元素不超过给定数量
skip(long n) 跳过元素,返回一个扔掉了前 n 个元素的流,若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
映射方法 描述
map(Funcation f) 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
mapToDouble(ToDoubleFunction f) 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 DoubleStream
mapToInt(TolintFunction f) 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的IntStream
mapToLong(ToLongFunction f) 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的LongStream


flatMap(Function f) 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流


排序方法 描述

sorted() 产生一个新流,其中按自然顺序排序
sorted(Comparator com) 产生一个新流,其中按比较器顺序排序


filter 用法


public class LambdaTest {
  @Test
  public void test(){
    List<Student> students = StudentData.getStudent();
    //筛选出性别为男的同学信息
    students.stream().filter(p-> '男' == p.getsex()).forEach(System.out::println);
  }
}

20210607143105667.png

distinct 用法 (去重复数据是通过流所生成元素的 hashCode() 和 equals() 所以实体类中需要生成对应的方法)

public class LambdaTest {
  @Test
  public void test(){
    List<Student> students = StudentData.getStudent();
    //去掉重复的数据
    students.stream().distinct().forEach(System.out::println);
  }
}

20210607144319729.png

limt 用法

public class LambdaTest {
  @Test
  public void test(){
    List<Student> students = StudentData.getStudent();
    //展示前三个同学的信息
    students.stream().limit(3).forEach(System.out::println);
  }
}

20210607143318939.png


skip 用法

public class LambdaTest {
  @Test
  public void test(){
    List<Student> students = StudentData.getStudent();
    //显示除了前三个之外的学生信息
    students.stream().skip(3).forEach(System.out::println);
  }
}

image.png

map 用法

public class LambdaTest {
  @Test
  public void test(){
    List<Student> students = StudentData.getStudent();
    //获取到男学生的姓名映射到新的集合中并打印
    students.stream().filter(student -> '男'==student.getsex()).map(Student::getName).forEach(System.out::println);
  }
}

20210607145719202.png

  • Stream 终止操作

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

流进行了终止操作后,不能再使用!

匹配与查找方法 描述
allMatch(Predicate p) 检查是否匹配所有元素
anyMatch(Predicate p) 检查是否至少匹配一个元素
noneMatch(Predicate p) 检查是否没有匹配所有元素
findFirst() 返回第一个元素
findAny() 返回当前流中的任意元素
count() 返回流中元素的总个数
max(Comparator c) 返回流中最大值
min(Comparator c) 返回流中最小值
forEach(Consumer c) 内部迭代
规约 方法 描述
reduce(T iden,BlnaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回 T
reduce(BlnaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回 Optional < T >
收集 方法 描述
collect(Collector c) 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法

allMatch 方法 (allMatch方法需要所有匹配才会返回true)

public class LambdaTest {
  @Test
  public void test(){
    List<Student> students = StudentData.getStudent();
    //所有学生是不是都是男生
    boolean rst = students.stream().allMatch(student -> '男' == student.getsex());
    System.out.println(rst);
  }
}

20210607151243450.png


anyMatch 方法 (anyMatch方法只需要一个元素匹配就可以返回true)


public class LambdaTest {
  @Test
  public void test(){
    List<Student> students = StudentData.getStudent();
    //是否存在人妖
    boolean rst = students.stream().anyMatch(student -> '妖' == student.getsex());
    System.out.println(rst);
  }
}

20210607153210658.png

reduce 方法

public class LambdaTest {
  @Test
  public void test(){
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    //计算 1-10 的自然数的和
    Integer sum = list.stream().reduce(0, Integer::sum);
    System.out.println(sum);
  }
}

2021060715420924.png

public class LambdaTest {
  @Test
  public void test(){
    List<Student> students=StudentData.getStudent();
    //学生id的总和
    Optional<Integer> idSum = students.stream().map(Student::getId).reduce(Integer::sum);
    System.out.println(idSum);
  }
}

20210607155628350.png

collect 方法 (Collector 对象也有很多可选方法)

20210607160504523.png

public class LambdaTest {
  @Test
  public void test(){
    List<Student> students=StudentData.getStudent();
    //查找性别为女的学生并返回一个 list集合
    List<Student> list = students.stream().filter(student -> '女' == student.getsex()).collect(Collectors.toList());
    System.out.println(list);
  }
}

20210607160149312.png

在此只演示个别的方法,小伙伴们私下可自行练习 (^ - ^) !

相关文章
|
11月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
Java API 开发者
413 0
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
576 1
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
1099 1
|
缓存 安全 Java
Java 并发新特性实战教程之核心特性详解与项目实战
本教程深入解析Java 8至Java 19并发编程新特性,涵盖CompletableFuture异步编程、StampedLock读写锁、Flow API响应式流、VarHandle内存访问及结构化并发等核心技术。结合电商订单处理、缓存系统、实时数据流、高性能计数器与用户资料聚合等实战案例,帮助开发者高效构建高并发、低延迟、易维护的Java应用。适合中高级Java开发者提升并发编程能力。
644 0
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
532 1
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
769 0
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
384 2