JAVA高效编程三(流编程)

流的构建

 

 

 

使用方法

/**
* 流的四种构建形式
*/
public class StreamConstructor {

/**
* 由数值直接构建流
*/
@Test
public void streamFromValue() {
Stream stream = Stream.of(1, 2, 3, 4, 5);

stream.forEach(System.out::println);
}

/**
* 通过数组构建流
*/
@Test
public void streamFromArray() {
int[] numbers = {1, 2, 3, 4, 5};
      
       // 只能传一个int[] 类型的数组
IntStream stream = Arrays.stream(numbers);
stream.forEach(System.out::println);
}

/**
* 通过文件生成流
* @throws IOException
*/
@Test
public void streamFromFile() throws IOException {
// TODO 此处替换为本地文件的地址全路径
String filePath = "";
       
      // 用此方法打印文件内容非常方便
Stream<String> stream = Files.lines(
Paths.get(filePath));

stream.forEach(System.out::println);
}

/**
* 通过函数生成流(无限流)
*/
@Test
public void streamFromFunction() {

// Stream stream = Stream.iterate(0, n -> n + 2);

Stream stream = Stream.generate(Math::random);

stream.limit(100)
.forEach(System.out::println);

}

}


收集器与预定义收集器

                

 

 

 

 概念区分:collect是方法,Collector是集合接口,Collectors是集合工具类

 

使用方法


/**
* 常见预定义收集器使用
*/
public class StreamCollector {

/**
* 集合收集器
*/
@Test
public void toList() {

List<Sku> list = CartService.getCartSkuList();

List<Sku> result = list.stream()
.filter(sku -> sku.getTotalPrice() > 100)

.collect(Collectors.toList());

System.out.println(
JSON.toJSONString(result, true));

}

/**
* 分组
*/
@Test
public void group() {
List<Sku> list = CartService.getCartSkuList();

// Map<分组条件,结果集合>
Map<Object, List<Sku>> group = list.stream()
.collect(
Collectors.groupingBy(
sku -> sku.getSkuCategory()));

System.out.println(
JSON.toJSONString(group, true));
}

/**
* 分区 根据判断条件返回两个分区,一个是结果为true的,另一个是结果为false的
*/
@Test
public void partition() {
List<Sku> list = CartService.getCartSkuList();

Map<Boolean, List<Sku>> partition = list.stream()
.collect(Collectors.partitioningBy(
sku -> sku.getTotalPrice() > 100));

System.out.println(
JSON.toJSONString(partition, true));
}

}
       

 

 

 

 

 

 

 

 

归约与汇总代码演示 

/**
* 类名称:ReduceAndCollectTest
* ********************************
* <p>
* 类描述:归约与汇总操作
*
* @author zhangxiaoxi
* @date 下午7:45
*/
public class ReduceAndCollectTest {


@Test
public void reduceTest() {

/**
* 订单对象
*/
@Data
@AllArgsConstructor
class Order {
/**
* 订单编号
*/
private Integer id;
/**
* 商品数量
*/
private Integer productCount;
/**
* 消费总金额
*/
private Double totalAmount;
}

/*
准备数据
*/
ArrayList<Order> list = Lists.newArrayList();
list.add(new Order(1, 2, 25.12));
list.add(new Order(2, 5, 257.23));
list.add(new Order(3, 3, 23332.12));

/*
以前的方式:
1. 计算商品数量
2. 计算消费总金额
*/

/*
汇总商品数量和总金额
*/
Order order = list.stream()
.parallel()
.reduce(
// 初始化值
new Order(0, 0, 0.0),

// Stream中两个元素的计算逻辑
(Order order1, Order order2) -> {
System.out.println("执行 计算逻辑 方法!!!");

int productCount =
order1.getProductCount()
+ order2.getProductCount();

double totalAmount =
order1.getTotalAmount()
+ order2.getTotalAmount();

return new Order(0, productCount, totalAmount);
},

// 并行情况下,多个并行结果如何合并
(Order order1, Order order2) -> {
System.out.println("执行 合并 方法!!!");

int productCount =
order1.getProductCount()
+ order2.getProductCount();

double totalAmount =
order1.getTotalAmount()
+ order2.getTotalAmount();

return new Order(0, productCount, totalAmount);
});

System.out.println(JSON.toJSONString(order, true));
}


@Test
public void collectTest() {
/**
* 订单对象
*/
@Data
@AllArgsConstructor
class Order {
/**
* 订单编号
*/
private Integer id;
/**
* 用户账号
*/
private String account;
/**
* 商品数量
*/
private Integer productCount;
/**
* 消费总金额
*/
private Double totalAmount;
}

/*
准备数据
*/
ArrayList<Order> list = Lists.newArrayList();
list.add(new Order(1, "zhangxiaoxi", 2, 25.12));
list.add(new Order(2, "zhangxiaoxi",5, 257.23));
list.add(new Order(3, "lisi",3, 23332.12));

/*
Map<用户账号, 订单(数量和金额)>
*/

Map<String, Order> collect = list.stream()
.parallel()
.collect(
() -> {
System.out.println("执行 初始化容器 操作!!!");

return new HashMap<String, Order>();
},
(HashMap<String, Order> map, Order newOrder) -> {
System.out.println("执行 新元素添加到容器 操作!!!");

/*
新元素的account已经在map中存在了
不存在
*/
String account = newOrder.getAccount();

// 如果此账号已存在,将新订单数据累加上
if (map.containsKey(account)) {
Order order = map.get(account);
order.setProductCount(
newOrder.getProductCount()
+ order.getProductCount());
order.setTotalAmount(
newOrder.getTotalAmount()
+ order.getTotalAmount());
} else {
// 如果不存在,直接将新订单存入map
map.put(account, newOrder);
}

}, (HashMap<String, Order> map1, HashMap<String, Order> map2) -> {
System.out.println("执行 并行结果合并 操作!!!");

map2.forEach((key, value) -> {
map1.merge(key, value, (order1, order2) -> {

// TODO 注意:一定要用map1做合并,因为最后collect返回的是map1
return new Order(0, key,
order1.getProductCount()
+ order2.getProductCount(),
order1.getTotalAmount()
+ order2.getTotalAmount());
});
});
});

System.out.println(JSON.toJSONString(collect, true));
}
}
posted @ 2021-01-07 23:38  红嘴鲤鱼  阅读(167)  评论(0编辑  收藏  举报