将嵌套for循环转换为java 11中的流

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

转换为

Streams
:

private static List<Location> extractLocation(List<Location> locations){
        List<Location> locationList = new ArrayList<>();
        for(Location l : locations){
            if(l!=null){
                final Location location = Location.builder()
                        .id(l.getId())
                        .build();
                for(Address address: l.getAddresses()){
                    if(address.getType().equals("primary")){
                        location.setPrimaryAddress(address);
                    }
                    else{
                        location.setBillingAddress(address);
                    }
                }
                locationList.add(location);
            }
        }
        return locationList;
    }

构建对象后我陷入困境。对于嵌套循环,由于这是构建

Location object
后的下一步,因此在此应用
Stream method
来设置主要地址和账单地址。

private static List<Location> extractLocationStream(List<Location> locations){
        return locations.stream()
                .filter(location -> location!=null)
                .map(location ->
                {
                    Location l = Location.builder()
                        .id(location.getId())
                        .build();
                    location.getAddresses().stream()
                            .filter(address -> address.getType().equals("primary")).// what to do now
                })

                .collect(Collectors.toList());
    }
java lambda stream java-stream
1个回答
0
投票

要使用 Java Streams 设置主要地址和账单地址,您可以使用 Collectors.toMap 在映射操作中按地址类型对地址进行分组。以下是您可以修改 extractLocationStream 方法来实现此目的的方法:

private static List<Location> extractLocationStream(List<Location> locations) {
    return locations.stream()
        .filter(location -> location != null)
        .map(location -> {
            Location.Builder locationBuilder = Location.builder() .id(location.getId());

            Map<String, Address> addressMap = location.getAddresses().stream()
                    .collect(Collectors.toMap(Address::getType, address -> address));

            locationBuilder.primaryAddress(addressMap.get("primary"));
            locationBuilder.billingAddress(addressMap.get("billing"));

            return locationBuilder.build();
        })
        .collect(Collectors.toList());
}

在此代码中:

  • 我为每个 Location 对象创建了一个 locationBuilder。
  • 已使用 Collectors.toMap 收集器创建地址映射(如答案开头所述),其中键是地址类型(“主要”或“计费”),值是地址对象本身。
  • 然后,根据addressMap中的值设置Location对象的primaryAddress和billingAddress字段。
  • 最后,使用 locationBuilder.build() 使用更新后的地址构建 Location 对象。

基本上,代码使用 JavaStreams 处理 Location 对象列表,并将修改后的 Location 对象收集到列表中(根据需要)。

© www.soinside.com 2019 - 2024. All rights reserved.