使用Java Stream实现
import java.util.ArrayList;
import java.util.List;
class Order {
private User user;
private Product product;
private long orderTime;
public Order(User user, Product product, long orderTime) {
this.user = user;
this.product = product;
this.orderTime = orderTime;
}
public User getUser() {
return user;
}
public Product getProduct() {
return product;
}
public long getOrderTime() {
return orderTime;
}
}
class User {
private String id;
public User(String id) {
this.id = id;
}
public String getId() {
return id;
}
}
class Product {
private String type;
private double price;
public Product(String type, double price) {
this.type = type;
this.price = price;
}
public String getType() {
return type;
}
public double getPrice() {
return price;
}
}
public class EcommerceSystem {
public static void main(String[] args) {
List<Order> orders = new ArrayList<>();
// 初始化订单数据
orders.add(new Order(new User("1"), new Product("electronics", 100.0), 1600000000000L));
orders.add(new Order(new User("2"), new Product("clothes", 50.0), 1600000001000L));
orders.add(new Order(new User("1"), new Product("electronics", 200.0), 1600000002000L));
String targetUserId = "1";
long startTime = 1600000000000L;
long endTime = 1600000002000L;
String targetProductType = "electronics";
double totalAmount = orders.stream()
.filter(order -> targetUserId.equals(order.getUser().getId())
&& order.getOrderTime() >= startTime && order.getOrderTime() <= endTime
&& targetProductType.equals(order.getProduct().getType()))
.mapToDouble(order -> order.getProduct().getPrice())
.sum();
System.out.println("Total amount: " + totalAmount);
}
}
使用传统foreach实现
import java.util.ArrayList;
import java.util.List;
class Order {
private User user;
private Product product;
private long orderTime;
public Order(User user, Product product, long orderTime) {
this.user = user;
this.product = product;
this.orderTime = orderTime;
}
public User getUser() {
return user;
}
public Product getProduct() {
return product;
}
public long getOrderTime() {
return orderTime;
}
}
class User {
private String id;
public User(String id) {
this.id = id;
}
public String getId() {
return id;
}
}
class Product {
private String type;
private double price;
public Product(String type, double price) {
this.type = type;
this.price = price;
}
public String getType() {
return type;
}
public double getPrice() {
return price;
}
}
public class EcommerceSystem {
public static void main(String[] args) {
List<Order> orders = new ArrayList<>();
// 初始化订单数据
orders.add(new Order(new User("1"), new Product("electronics", 100.0), 1600000000000L));
orders.add(new Order(new User("2"), new Product("clothes", 50.0), 1600000001000L));
orders.add(new Order(new User("1"), new Product("electronics", 200.0), 1600000002000L));
String targetUserId = "1";
long startTime = 1600000000000L;
long endTime = 1600000002000L;
String targetProductType = "electronics";
double totalAmount = 0;
for (Order order : orders) {
if (targetUserId.equals(order.getUser().getId())
&& order.getOrderTime() >= startTime && order.getOrderTime() <= endTime
&& targetProductType.equals(order.getProduct().getType())) {
totalAmount += order.getProduct().getPrice();
}
}
System.out.println("Total amount: " + totalAmount);
}
}
Java Stream在复杂业务场景下逻辑解耦的优势
- 声明式编程风格:Java Stream使用声明式编程,只需要描述要做什么,而不是怎么做。例如在Stream代码中,通过
filter
描述筛选条件,mapToDouble
描述提取价格操作,sum
描述求和操作。而传统foreach
是命令式编程,需要详细描述循环内的每一步操作,逻辑耦合度高。
- 代码可读性增强:Stream的链式调用使得代码更清晰,每个操作步骤一目了然,如筛选用户、时间范围、商品类型以及计算总金额,这些步骤在Stream代码中清晰呈现。而
foreach
循环中所有逻辑都混杂在循环体内,可读性较差。
- 易于维护和扩展:如果需求发生变化,例如需要添加新的筛选条件,在Stream中只需在
filter
操作中添加新条件即可,对其他部分代码影响小。而在foreach
循环中,可能需要在复杂的循环体逻辑中进行修改,容易引入错误。
- 并行处理:Java Stream可以方便地进行并行处理,通过
parallelStream
,在多核环境下可以显著提高处理效率,并且不需要开发者手动管理线程。而传统foreach
要实现并行处理则需要手动编写多线程代码,增加了代码复杂度和耦合度。