有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是从列表中以函数方式创建列表的最干净的方法吗?

我有以下代码:

List<DataObject> dataObjectList = new ArrayList<>();
for (Company company : companyRepository.findAll()) {
    for (Employee employee : company.employees) {
        DataOjbect dataObject = new dataObject();
        dataObject.setCompanyName(company.getName());
        dataObject.setEmployeeName(employee.getName());
        dataObjectList.add(dataObject);
    }
}

用java编写函数式代码最干净的方法是什么

请注意companyRepository.findAll()返回一个迭代器,因此不能简单地从中创建流


共 (2) 个答案

  1. # 1 楼答案

    在我看来,使用流来实现这一点并没有真正的好处。我会坚持你所拥有的。您可以通过在DataObject类中创建一个constructor使其更加简洁。然后您可以执行以下操作:

    List<DataObject> dataObjectList = new ArrayList<>();
    
    for (Company company : companyRepository.findAll()) {
        for (Employee employee : company.employees) {
            dataObjectList.add(new DataObject(company.getName(), employee.getName()));
        }
    }
    
  2. # 2 楼答案

    要从Iterator创建Stream,需要首先创建Iterable,然后使用Iterable::spliterator方法将其Spliterator传递到StreamSupport::stream

    Stream<?> stream = StreamSupport.stream(iterable.spliterator(), false);
    

    只要Iterable只有一个抽象方法,就可以通过lambda表达式从Iterator创建Iterable,因此该接口适用于此类表达式

    Iterable<Company> iterable = () -> companyRepository.findAll();
    Stream<Company> stream = StreamSupport.stream(iterable.spliterator(), false);
    

    现在,事情变得简单了:利用flatMap的优势,将嵌套的列表结构(每个公司都有一个员工列表的公司列表)展平。您需要在flatMap方法内部创建每个DataObject,只要其实例化依赖于company.getName()参数:

    List<DataObject> dataObjectList = StreamSupport.stream(iterable.spliterator(), false)
            .flatMap(company -> company.getEmployees().stream()
                    .map(employee -> {
                        DataObject dataObject = new DataObject();
                        dataObject.setCompanyName(company.getName());
                        dataObject.setEmployeeName(employee.getName());
                        return dataObject;
                    }))
            .collect(Collectors.toList());
    

    。。。如果您使用构造函数,那么就不会那么冗长了

    List<DataObject> dataObjectList = StreamSupport.stream(iterable.spliterator(), false)
            .flatMap(company -> company.getEmployees().stream()
                .map(employee -> new DataObject(company.getName(), employee.getName())))
            .collect(Collectors.toList());