Stream API简化复杂的集合操作和分组逻辑

使用 Java 的 Stream API 可以显著简化集合操作和分组逻辑,使代码更简洁易读。以下是一些常见的场景及其示例代码:

1. 简单过滤和映射

假设有一个 Order 类,并希望筛选出特定机房的订单,然后获取这些订单的 SN(序列号)。

示例代码:
import java.util.List;
import java.util.stream.Collectors;

public class Order {
    private String sn;
    private String originalRoom;
    private String targetRoom;

    // getters and setters
}

public class OrderService {
    public List<String> getSnByRoom(List<Order> orders, String room) {
        return orders.stream()
                     .filter(order -> room.equals(order.getOriginalRoom()) || room.equals(order.getTargetRoom()))
                     .map(Order::getSn)
                     .collect(Collectors.toList());
    }
}

2. 分组和统计

假设你希望根据原机房和目标机房分组订单,并统计每个分组的订单数量。

示例代码:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class OrderService {
    public Map<String, Long> countOrdersByRoom(List<Order> orders) {
        return orders.stream()
                     .collect(Collectors.groupingBy(
                         order -> order.getOriginalRoom() + "-" + order.getTargetRoom(),
                         Collectors.counting()
                     ));
    }
}

3. 多级分组

如果你需要进行多级分组,比如先按原机房分组,然后在每个组内按目标机房分组。

示例代码:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class OrderService {
    public Map<String, Map<String, Long>> countOrdersByMultiLevelRoom(List<Order> orders) {
        return orders.stream()
                     .collect(Collectors.groupingBy(
                         Order::getOriginalRoom,
                         Collectors.groupingBy(
                             Order::getTargetRoom,
                             Collectors.counting()
                         )
                     ));
    }
}

4. 分组后的进一步操作

在分组后对每个组的数据进行进一步的操作,比如获取每个分组内的订单列表。

示例代码:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class OrderService {
    public Map<String, List<Order>> groupOrdersByRoom(List<Order> orders) {
        return orders.stream()
                     .collect(Collectors.groupingBy(
                         order -> order.getOriginalRoom() + "-" + order.getTargetRoom()
                     ));
    }
}

5. 使用自定义收集器

如果你有更复杂的需求,可以使用自定义收集器来完成。假设你需要根据SN进行分组,然后统计每个分组的订单数量。

示例代码:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class OrderService {
    public Map<String, Long> countOrdersBySn(List<Order> orders) {
        return orders.stream()
                     .collect(Collectors.groupingBy(
                         Order::getSn,
                         Collectors.counting()
                     ));
    }
}

总结

通过使用 Java 的 Stream API,可以简化复杂的集合操作和分组逻辑,使代码更加简洁和易于维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值