解放码农的java-8 stream

简介: 解放码农的java-8 stream

一、流的操作流程



  1. 一个执行查询的数据源
  2. 一个中间操作链,形成一条流的流水线
  3. 一个终端操作,执行流水线,并能生成结果


@Data
@Accessor(chain=true) //链式
public class User {
   private String id;
   private String name;
   private int age;
   public boolean isOldEnough(){
    return age > 26;
   } 
}
//生成数据源
public class UserUtils {
   public static List<User> createUsers(){
    List<User> users = new ArrayList<User>();
    for(int i = 0 ; i<100 ; i++){
     User user = new User();
     user.setId(i+"id").setName("name"+i).setAge(i);
     users .add(user);
    }
    return users;
   }
}


二、中间操作的方法



1.用谓词筛选:filter(),该操作返回一个谓词做参数,并返回一个符合谓词的元素的流


//筛选出年龄大于26的用户
//老式写法
List<User> users = UserUtils.createUsers();
List<User> filteredUsers = new ArrayList<>();
users.forEach((user)->{
 if(user.isOldEnough()){
  filteredUsers .add(user);
 }
});
//流式写法
List<User> users = UserUtils.createUsers().stream().filter(User :: isOldEnough).collect(Collectors.toList());


2.去重:distinct(),返回一个元素各异的流


List<User> users = UserUtils.createUsers().stream().distinct().(Collectors.toList());


3.截短流:limit(int n),返回一个指定长度的流


List<User> users = UserUtils.createUsers().stream().limit(6).(Collectors.toList());


4.跳过元素:skip(int n),返回一个丢弃了前n个元素的流,如果元素不足n个,则返回一个空流


List<User> users = UserUtils.createUsers().stream().skip(6).(Collectors.toList());
//skip()和limit()是一对方法,可以结合使用达到对数据进行分段处理的目的
List<User> users = UserUtils.createUsers().stream().skip(6).limit(6).(Collectors.toList()); //获取第二个6元素的集合


5.映射:map(),接收一个函数,将应用到每个元素上,并映射成一个新的元素


List<String> userNames = UserUtils.createUsers().stream().map(User :: getName).(Collectors.toList());


6.流的扁平化:flatMap(),各个数组并不是分别映射成一个流,而是转化为流的内容


List<Integer> num1 = Arrays.asList(1,2,3);
List<Integer> num2 = Arrays.asList(3,4);
List<int[]> list = num1.stream().flatMap(i->{
 num2.stream().map(j->new int[]{i,j})
}).collect(Collectors.toList());
//执行结果为[(1,3),(1,4),(2,3),(2,4),(3,3),(3,4)]


三、终端操作的方法



1.查找和匹配:allMatch(),anyMatch(),noneMatch(),findFirst()和findAny()


boolean isOld = UserUtils.createUsers().stream().anyMatch(User :: isOldEnough);
/**
 * allMatch(),检查是否所有的元素都符合给定的谓词
 * anyMatch(),检查是否有一个元素符合给定的谓词
 * noneMatch(),检查是否元素都不符合给定的谓词
 * findAny(),返回当前流中的任意元素,可以和filter()结合使用效果更好
 * findFirst(),查找第一个元素
 */
List<User> users = UserUtils.createUsers().stream().filter(User :: isOldEnough).findAny();


规约:reduce(),将流中的元素反复结合起来,得到一个值


List<Integer> nums = Arrays.asList(1,2,3,4,5,6);
int num = nums.stream().reduce(0,Integer :: sum); //执行结果21


收集器:collector(),将元素按指定方法收集起来


Collectors.toList(),把流中的所有元素收集到一个List里;
.toSet(),返回一个set
.toCollection(),把流中的所有元素放到指定的集合中 //使用方法:collect(toCollection(),ArrayList :: new);
counting(),计算流中的元素个数;
summingInt(),对流中的整数性求和;
averaingInt(),返回平均值;
summarizingInt(),收集流中的Integer属性的统计值,最大、最小、平均值等;
joining(),调用toString()方法;
maxBy(),按照指定比较器的最大值;
minBy(),最小值;
reducing(),合并为单个值(二进制);
collectingAndThen(),对结果应用转换函数;
groupingBy(),分组操作;
partitingBy(boolean flag),对结果进行分区


并行流


parallel(),将顺序流变成并行流; sequential(),将并行流转换成顺序流;


list.parallelStream().sorted(Comparator.compring(User :: getName)).sequential().collect(Collectors.groupingB
目录
相关文章
|
1月前
|
SQL Java API
使用Java Stream API简化集合操作
使用Java Stream API简化集合操作
|
4天前
|
Java API 开发者
|
12天前
|
存储 算法 Oracle
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
39 8
|
9天前
|
自然语言处理 Java API
"告别Java8 Stream噩梦,JDFrame神器来袭!让你的代码简洁如诗,效率翻倍,编程新体验等你尝鲜!"
【8月更文挑战第11天】Java 8的Stream API以强大的函数式编程能力革新了集合数据处理方式,但其抽象概念和复杂的链式调用让不少开发者望而却步。为此,JDFrame框架应运而生,通过直观易懂的操作符简化Stream使用,减少代码量并提高效率。
25 3
|
14天前
|
数据可视化 IDE Java
Java8的Stream流太难用了?看看JDFrame带来的革新体验
【8月更文挑战第6天】在Java开发者的日常工作中,Java 8引入的Stream API无疑是一个革命性的特性,它极大地简化了集合(Collection)的处理方式,使得数据操作更加声明式、函数式。然而,对于初学者或是从早期Java版本迁移过来的开发者而言,Stream API的复杂性和抽象性可能会成为一道门槛。今天,我们就来探讨如何通过JDFrame这样的工具或框架,以及掌握一些高效学习策略,让Java Stream的使用变得更加得心应手。
53 5
|
13天前
|
存储 Java API
探索Java中的Stream API: 提升数据处理的效率与优雅
在Java的海洋中,Stream API如同一股清流,为数据处理注入了新的活力。本文将深入探讨Stream API的核心概念、操作以及它如何改变我们编写和理解代码的方式。通过实际案例,我们将揭示这一现代编程范式如何简化集合处理,提高代码的可读性与性能。
|
17天前
|
Java API 数据处理
Java 8新特性:Stream API的实用指南
【8月更文挑战第3天】在Java 8中,最引人注目的新特性之一是Stream API。这个API允许开发者以声明式方式处理数据集合,提供了一种高效且易于理解的数据处理方法。本文将介绍Stream API的基本概念、常用操作以及如何在实际开发中应用。
|
3天前
|
并行计算 Java API
|
5天前
|
前端开发 Oracle Java
Java 22 新增利器: 使用 Java Stream Gather 优雅地处理流中的状态
本文我们分析了 什么 是 “流”,对比了 Java 上几种常见的 “流”库,引入和详细介绍了 Java 22 中的 Stream Gather API 。同时也简单分享了利用 虚拟线程 如何简化 StreammapConcurrent操作符的实现。
|
5天前
|
Java API
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的