Java8使⽤Stream流实现List列表的遍历、统计、排序等        Java8提供了Stream(流)处理集合的关键抽象概念,Stream 使⽤⼀种类似⽤ SQL 语句从数据库查询数据的直观⽅式来提供⼀种对 Java 集合运算和表达的⾼阶抽象。它可以对集合进⾏操作,可以执⾏⾮常复杂的查、过滤和映射数据等操作。Stream API 借助于同样新出现的Lambda表达式,极⼤提⾼Java程序员的⽣产⼒,让程序员写出⾼效率、⼲净、简洁的代码。
下⾯是Stream常⽤函数综合实例:
创建User.class(⽤户信息表)
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* 功能:⽤户表
*
* ──────────────────────────────────────────
*  version  变更⽇期修改⼈修改说明
* ------------------------------------------
*  V1.0.0  2021/8/20    CHY    初版
* ──────────────────────────────────────────
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int id;
private String name;
private String sex;
private int age;
private String dept;
private BigDecimal salary;
}
⼀、遍历⽅法
1.forEach()
使⽤forEach()遍历列表数据。
public class forEachTest {
public static void main(String[] args) {
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
userList.add(new User(3, "颜如⽟", "⼥", 20, "⼈事部", BigDecimal.valueOf(1700)));
userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
userList.add(new User(5, "杜⼩⽉", "⼥", 23, "⼈事部", BigDecimal.valueOf(1500)));
//1.使⽤ forEach() 遍历列表数据
System.out.println("======================使⽤ forEach() 遍历列表数据⽅法1======================");
userList.forEach(System.out::println);
System.out.println("======================使⽤ forEach() 遍历列表数据⽅法2======================");
userList.forEach(user -> System.out.println(user));
}
}
执⾏结果:
2.filter(T -> boolean)
使⽤filter()过滤列表数据。
【⽰例】获取部门为"⼈事部"的⽤户列表
public class filterTest {
public static void main(String[] args) {
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
userList.add(new User(3, "颜如⽟", "⼥", 20, "⼈事部", BigDecimal.valueOf(1700)));
userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
userList.add(new User(5, "杜⼩⽉", "⼥", 23, "⼈事部", BigDecimal.valueOf(1500)));
/**
* 2.filter(T -> boolean)
张云龙王一菲恋情
* 使⽤ filter() 过滤列表数据。
* 【⽰例】获取部门为“研发部”的⽤户列表
* */
System.out.println("======================使⽤ filter() 过滤列表数据======================");
阿sa石恒聪分手
userList.stream().filter(user -> Dept().equals("⼈事部")).List()).forEach(System.out::println);    }
}
执⾏结果:
3.findAny()和findFirst()
使⽤findAny()和findFirst()获取第⼀天数据。
酒后驾驶怎么处罚
如何提高专注力【⽰例】获取⽤户名称为"杜⼩⽉"的⽤户信息,如果未到则返回null。
public class findAnytTest {
public static void main(String[] args) {
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
userList.add(new User(3, "颜如⽟", "⼥", 20, "⼈事部", BigDecimal.valueOf(1700)));
userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
userList.add(new User(5, "杜⼩⽉", "⼥", 23, "⼈事部", BigDecimal.valueOf(1500)));
/**
* 3.findAny() 和 findFirst()
* 使⽤ findAny() 和 findFirst() 获取第⼀条数据。
*【⽰例】获取⽤户名称为“杜⼩⽉”的⽤户信息,如果未到则返回null
*【⽰例】获取⽤户名称为“杜⼩⽉”的⽤户信息,如果未到则返回null
*
* PS:findFirst()和findAny都是获取列表中的第⼀条数据,但是fandAny()操作发,返回的元素是不确定的,对于同⼀个列表多次调⽤findAny()有可能会返回不同的        * 使⽤findAny()是为了更⾼效的性能。如果是数据较少,串⾏的情况下,⼀般都会返回第⼀个结果,如果是并⾏(parallelStream并⾏流)的情况下,那就不能确保是        * */
System.out.println("======================使⽤ findAny() 和 findFirst() 获取第⼀条数据 ======================");
User user = userList.stream().filter(u -> u.getName().equals("杜⼩⽉")).findAny().orElse(null);
System.out.println("存在杜⼩⽉的⽤户信息:" + user);
User user1 = userList.stream().filter(u -> u.getName().equals("戴沾")).findFirst().orElse(null);
System.out.println("不存在戴沾的⽤户信息:" + user1);
}
}
执⾏结果:
4.map(T -> R) 和flatMap(T -> stream)
使⽤map()将流中的每⼀个元素T映射为R(类似类型转换)。
使⽤flatMap()将流中的每⼀个元素T映射为⼀个流,再把每⼀个流连接成⼀个流。
【⽰例】使⽤map()⽅法获取⽤户列表中的名称列。
public class mapTest {
public static void main(String[] args) {
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
userList.add(new User(3, "颜如⽟", "⼥", 20, "⼈事部", BigDecimal.valueOf(1700)));
userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
userList.add(new User(5, "杜⼩⽉", "⼥", 23, "⼈事部", BigDecimal.valueOf(1500)));
/**
* 4.map(T -> R) 和 flatMap(T -> Stream)
* 使⽤ map() 将流中的每⼀个元素 T 映射为 R(类似类型转换)。
* 使⽤ flatMap() 将流中的每⼀个元素 T 映射为⼀个流,再把每⼀个流连接成为⼀个流。
* 【⽰例】使⽤ map() ⽅法获取⽤户列表中的名称列
* */
System.out.println("======================使⽤ map() 将流中的每⼀个元素 T 映射为 R(类似类型转换)======================");
List<String> nameList = userList.stream().map(User::getName).List());
nameList.forEach(System.out::println);
}
}
执⾏结果:
【⽰例】使⽤flatMap()将流中的每⼀个元素链接成为⼀个流。
public class flatMapTest {
public static void main(String[] args) {
//创建⽤户列表
List<String> userList = new ArrayList<String>();
userList.add("康熙爷、莫愁、颜如⽟");
物以类聚人以分userList.add("纪晓岚、杜⼩⽉、和珅");
//分割⽤户列表,使⽤flatMap()将流中的每⼀个元素链接成⼀个流。
userList = userList.stream()
.map(city -> city.split("、"))
.flatMap(Arrays::stream)
我爱你520.List());
//遍历⽤户列表
userList.forEach(System.out::println);
}
}
执⾏结果:
5.distinct() 去重
使⽤distinct()⽅法可以去除重复的数据。
public class distinctTest {
public static void main(String[] args) {
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
userList.add(new User(3, "颜如⽟", "⼥", 20, "⼈事部", BigDecimal.valueOf(1700)));
userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
userList.add(new User(5, "杜⼩⽉", "⼥", 23, "⼈事部", BigDecimal.valueOf(1500)));
List<String> deptList = userList.stream().map(User::getDept).distinct().List());        deptList.forEach(System.out::println);
}
}
执⾏结果:
6.limit(long n)和skip(long n)
limit(long n)⽅法⽤于返回前n条数据,skip()⽅法⽤于跳过前n条数据。
【⽰例】获取⽤户列表,要求跳过第1条数据后的前3条数据。
public class limitAndSkipTest {
public static void main(String[] args) {
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
userList.add(new User(3, "颜如⽟", "⼥", 20, "⼈事部", BigDecimal.valueOf(1700)));
userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
userList.add(new User(5, "杜⼩⽉", "⼥", 23, "⼈事部", BigDecimal.valueOf(1500)));
List<User> limitAndSkipList = userList.stream().skip(1).limit(3).List());        limitAndSkipList.forEach(System.out::println);
}
}
执⾏结果:
⼆、判断⽅法
1.anyMatch(T -> boolean)
使⽤anyMatch(T -> boolean)判断流中是否有⼀个元素匹配给定的T -> boolean条件。
2.allMatch(T -> boolean)
使⽤ allMatch(T -> boolean) 判断流中是否所有元素都匹配给定的 T -> boolean 条件。
使⽤ noneMatch(T -> boolean) 流中是否没有元素匹配给定的 T -> boolean 条件。
【⽰例】使⽤ anyMatch()、allMatch()、noneMatch() 进⾏判断。
public class matchTest {
public static void main(String[] args) {
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
userList.add(new User(3, "颜如⽟", "⼥", 20, "⼈事部", BigDecimal.valueOf(1700)));
userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
userList.add(new User(5, "杜⼩⽉", "⼥", 23, "⼈事部", BigDecimal.valueOf(1500)));
//判断⽤户列表中是否存在名称为“杜⼩⽉”的数据
boolean result = userList.stream().anyMatch(user -> Name().equals("杜⼩⽉"));
//判断⽤户名称是否都包含“杜⼩⽉”字段
boolean result2 = userList.stream().allMatch(user -> Name().equals("杜⼩⽉"));
//判断⽤户名称是否存在不包含“杜⼩⽉”字段
boolean result3 = userList.stream().noneMatch(user -> Name().equals("杜⼩⽉"));
//打印结果
System.out.println("result=" + result);
System.out.println("result2=" + result2);
System.out.println("result3=" + result3);
}
}