如何将 Stream API 与对象数组列表一起使用?

问题描述 投票:0回答:4

我在下面给出了这个方法......我如何在流 api 中更改这个方法。

public List<AddNewSchoolBean> getEmployeeList() {

        List<AddNewSchoolBean> list = new ArrayList<>();

        try {
            List<Object[]> empList = null;

            empList = Dao.getEmpDetailsFromUserMst();

            if (empList.size() != 0) {
                for (Object[] obj : empList) {
                    AddNewSchoolBean bean = AddNewSchoolBean.builder()
                            .employeeId((obj[0]).toString())
                            .employeeName((obj[1]).toString())
                            .schoolName((obj[2]).toString())
                            .build();
                    list.add(bean);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
java api java-8 stream
4个回答
0
投票

你甚至可以简化到这个

@SneakyThrows
public List<AddNewSchoolBean> getEmployeeList() {
    return emptyIfNull(Dao.getEmpDetailsFromUserMst())
            .stream()
            .map(AddNewSchoolBean::new)
            .toList();
}

你的 AddNewSchoolBean 有对象构造函数

public class AddNewSchoolBean{
   String employeeId;
   String employeeName;
   String schoolName;

   public AddNewSchoolBean(Object[] data) {
       this.employeeId = String.valueOf(data[0]);
       this.employeeName = String.valueOf(data[1]);
       this.schoolName = String.valueOf(data[2]);
   }
}

需要一些额外的导入以使其更简单

import lombok.SneakyThrows;
import static org.apache.commons.collections4.ListUtils.emptyIfNull;

在此 Lambda 表达式中,您首先使用

emptyIfNull
(可以为空,但不会抛出 NPE)确保您的集合不为空,然后流式处理集合并将其映射到
AddNewSchoolBean
bean/entity通过构造函数。如果您愿意,您当然可以使用
with
,但这看起来更干净。然后最后你收集到
List
。请注意这是不可变的结果,如果你需要可变的,使用
.collect(Collectors.toList())


0
投票

假设您想在内部使用

java.util.Stream
我建议您先稍微润色/清理您的代码。

  1. 您不需要拆分
    empList
    变量的声明和赋值
  2. 将转换逻辑移动到
    private
    方法中。
  3. if
    检查尺寸不会添加任何东西。
public List<AddNewSchoolBean> getEmployeeList() {

    List<AddNewSchoolBean> list = new ArrayList<>();

    try {
        List<Object[]> empList = Dao.getEmpDetailsFromUserMst();
        for (Object[] obj : empList) {         
            AddNewSchoolBean bean = convert(obj);
            list.add(bean);        
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return list;
}

private AddNewSchoolBean convert(Object[] empArray) {
  return AddNewSchoolBean.builder()
                    .employeeId((empArray[0]).toString())
                    .employeeName((empArray[1]).toString())
                    .schoolName((empArray[2]).toString())
                    .build();
}

现在假设您不能更改

Dao.getEmpDetailsFromUserMst();
,您可以在
stream()
上使用
List
方法将其转换为
java.util.Stream
。然后就可以用
map
把数组转成对象最后collect到一个list返回。

public List<AddNewSchoolBean> getEmployeeList() {
        List<Object[]> empList = Dao.getEmpDetailsFromUserMst();
        return empList.stream()
                   .map(this::convert)
                   .toList();
}

这是假设您使用的是 JDK17,并且您当然需要上述

convert
方法。


0
投票

我认为干净的方式是将它映射到

AddNewSchoolBean
然后收集到List中:

public List<AddNewSchoolBean> getEmployeeList() {
    try {
        List<Object[]> empList = Dao.getEmpDetailsFromUserMst();

        return empList.stream()
                .map(this::createAddNewSchoolBean)
                .collect(Collectors.toList());

    } catch (Exception e) {
        e.printStackTrace();
    }
    return Collections.emptyList();
}

private AddNewSchoolBean createAddNewSchoolBean(Object[] obj) {
    return AddNewSchoolBean.builder()
            .employeeId(String.valueOf(obj[0]))
            .employeeName(String.valueOf(obj[1]))
            .schoolName(String.valueOf(obj[2]))
            .build();
}

-1
投票
list = empList.stream()
                .map(emp -> AddNewSchoolBean.builder()
                        .employeeId((emp[0]).toString())
                        .employeeName((emp[1]).toString())
                        .schoolName((emp[2]).toString())
                        .build()
        );
© www.soinside.com 2019 - 2024. All rights reserved.