解放码农的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
目录
相关文章
|
4月前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
128 0
|
17天前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
34 6
|
17天前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
8天前
|
Rust 安全 Java
Java Stream 使用指南
本文介绍了Java中Stream流的使用方法,包括如何创建Stream流、中间操作(如map、filter、sorted等)和终结操作(如collect、forEach等)。此外,还讲解了并行流的概念及其可能带来的线程安全问题,并给出了示例代码。
|
19天前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
24 0
|
1月前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
2月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
45 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
2月前
|
Java Shell 流计算
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
25 1
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
|
3月前
|
存储 Java API
Java——Stream流详解
Stream流是JDK 8引入的概念,用于高效处理集合或数组数据。其API支持声明式编程,操作分为中间操作和终端操作。中间操作包括过滤、映射、排序等,可链式调用;终端操作则完成数据处理,如遍历、收集等。Stream流简化了集合与数组的操作,提升了代码的简洁性
166 11
Java——Stream流详解
|
3月前
|
Java API C++
Java 8 Stream Api 中的 peek 操作
本文介绍了Java中`Stream`的`peek`操作,该操作通过`Consumer&lt;T&gt;`函数消费流中的每个元素,但不改变元素类型。文章详细解释了`Consumer&lt;T&gt;`接口及其使用场景,并通过示例代码展示了`peek`操作的应用。此外,还对比了`peek`与`map`的区别,帮助读者更好地理解这两种操作的不同用途。作者为码农小胖哥,原文发布于稀土掘金。
135 9
Java 8 Stream Api 中的 peek 操作