Java8特性Stream流对List列表实现查询、统计、排序、分组

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
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值