目录
1.forEach()
2.filter(T -> boolean)
3.findAny()和findFirst()
4.map(T -> R) 和flatMap(T -> stream)
5.distinct() 去重
6.limit(long n)和skip(long n)
7.anyMatch(T -> boolean)
8.allMatch(T -> boolean)
9.noneMatch(T -> boolean)
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() 过滤列表数据======================");
userList.stream().filter(user -> user.getDept().equals("人事部")).collect(Collectors.toList()).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).collect(Collectors.toList());
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)
.collect(Collectors.toList());
//遍历用户列表
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().collect(Collectors.toList());
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).collect(Collectors.toList());
limitAndSkipList.forEach(System.out::println);
}
}
执行结果:
7.anyMatch(T -> boolean)
使用anyMatch(T -> boolean)判断流中是否有一个元素匹配给定的T -> boolean条件。
8.allMatch(T -> boolean)
使用 allMatch(T -> boolean) 判断流中是否所有元素都匹配给定的
T -> boolean
条件。
9.noneMatch(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 -> user.getName().equals("杜小月"));
//判断用户名称是否都包含“杜小月”字段
boolean result2 = userList.stream().allMatch(user -> user.getName().equals("杜小月"));
//判断用户名称是否存在不包含“杜小月”字段
boolean result3 = userList.stream().noneMatch(user -> user.getName().equals("杜小月"));
//打印结果
System.out.println("result=" + result);
System.out.println("result2=" + result2);
System.out.println("result3=" + result3);
}
}
执行结果: