Java8提供了Stream(流)处理集合的关键抽象概念,它可以对集合进行操作,可以执行非常复杂的查找、过滤和映射数据等操作。Stream API 借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。
下面是使用Stream的常用方法的综合实例。
创建User类作为持久层。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
int id;
String name;
String sex;
int age;
String Department;
BigDecimal Salary;
}
创建UserService.class(用户信息业务逻辑类)。
package com.wsq;
import com.wsq.pojo.User;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/*
* 用户信息业务逻辑类
* @author wsq
*/
public class UserService {
/*
* 获取用户列表
*/
public static List<User> getUserList() {
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "wsq的博客_01", "男", 32, "研发部", BigDecimal.valueOf(1600)));
userList.add(new User(2, "wsq的博客_02", "男", 30, "财务部", BigDecimal.valueOf(1800)));
userList.add(new User(3, "wsq的博客_03", "女", 20, "人事部", BigDecimal.valueOf(1700)));
userList.add(new User(4, "wsq的博客_04", "男", 38, "研发部", BigDecimal.valueOf(1500)));
userList.add(new User(5, "wsq的博客_05", "女", 25, "财务部", BigDecimal.valueOf(1200)));
return userList;
}
}
一、查询方法
1.1 forEach()
使用 forEach() 遍历列表数据。
/*
* 使用forEach()遍历列表信息
* @author wsq
*/
@Test
public void forEachTest(){
//获取用户列表
List<User> userList = UserService.getUserList();
//遍历用户列表
System.out.println("---------------输出方法一-----------------");
userList.forEach(user -> {System.out.println(user);});
System.out.println("---------------输出方法二-----------------");
userList.forEach(System.out::println);
}
控制台输出:

1.2 filter(T -> boolean)
使用 filter() 过滤列表数据。
【示例】获取部门为“研发部”的用户列表。
/*
* 使用filter()过滤列表信息
* @author wsq
*/
@Test
public void filterTest(){
//获取用户列表
List<User> userList = UserService.getUserList();
//获取部门为“研发部”的用户列表
userList = userList.stream().filter(user -> user.getDepartment() == "研发部").collect(Collectors.toList());
//遍历用户列表
userList.forEach(System.out::println);
}
控制台输出:
1.3 findAny() 和 findFirst()
使用 findAny() 和 findFirst() 获取第一条数据。
【示例】获取用户名称为“wsq的博客_02”的用户信息,如果未找到则返回null。
/*
* 使用findAny()获取第一条数据
* @author wsq
*/
@Test
public void findAnytTest(){
//获取用户列表
List<User> userList = UserService.getUserList();
//获取用户名称为“pan_junbiao的博客_02”的用户信息,如果没有找到则返回null
User user = userList.stream().filter(u -> u.getName().equals("wsq的博客_02")).findAny().orElse(null);
//打印用户信息
System.out.println(user);
}
控制台输出:
注意:findFirst() 和 findAny() 都是获取列表中的第一条数据,但是findAny()操作,返回的元素是不确定的,对于同一个列表多次调用findAny()有可能会返回不同的值。使用findAny()是为了更高效的性能。如果是数据较少,串行地情况下,一般会返回第一个结果,如果是并行(parallelStream并行流)的情况,那就不能确保是第一个。
例如:使用parallelStream并行流,findAny() 返回的就不一定是第一条数据。
//parallelStream方法能生成并行流,使用findAny返回的不一定是第一条数据
User user = userList.parallelStream().filter(u -> u.getName().startsWith("wsq")).findAny().orElse(null);
1.4 map(T -> R) 和 flatMap(T -> Stream)
使用 map() 将流中的每一个元素 T 映射为 R(类似类型转换)。
使用 flatMap() 将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流。
【示例】使用 map() 方法获取用户列表中的名称列。
/*
* 使用map()获取列元素
* @author wsq

3388

被折叠的 条评论
为什么被折叠?



