Map<String, List> collect = list.stream().collect(Collectors.groupingBy(d -> fetchGroupKey(d)));
public static String fetchGroupKey(ScrapSpecial scrapSpecial) {
return scrapSpecial.getMaterialCode().toString() + scrapSpecial.getScrapReason().toString();
}
问题描述:项目Spring版本是3.x,不支持stream()的写法,如何将上面的stream流转变成普通写法。
可以使用for循环和HashMap来实现,如下:
HashMap<String, List<ScrapSpecial>> collect = new HashMap<>();
for (ScrapSpecial scrapSpecial : list) {
String key = fetchGroupKey(scrapSpecial);
if (collect.containsKey(key)) {
// 如果HashMap中已经存在key对应的集合,则将元素添加到集合中
collect.get(key).add(scrapSpecial);
} else {
// 如果HashMap中不存在key对应的集合,则创建新的集合并将元素添加进去
List<ScrapSpecial> tempList = new ArrayList<>();
tempList.add(scrapSpecial);
collect.put(key, tempList);
}
}
public static String fetchGroupKey(ScrapSpecial scrapSpecial) {
return scrapSpecial.getMaterialCode().toString() + scrapSpecial.getScrapReason().toString();
}
for (String key : collect.keySet()) {
System.out.println(key + ": " + collect.get(key));
}
1.新建Module:cloud-stream-rabbitmq-provider8801
2.pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<!--基础配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.主启动类StreamMQMain8801
@SpringBootApplication
public class StreamMQMain8801 {
public static void main(String[] args) {
SpringApplication.run(StreamMQMain8801.class);
}
}
4.yml
server:
port: 8801
spring:
application:
name: cloud-stream-provider
cloud:
stream:
binders: # 在此处配置要绑定的rabbitmq的服务信息;
defaultRabbit: # 表示定义的名称,用于于binding整合
type: rabbit # 消息组件类型
environment: # 设置rabbitmq的相关的环境配置
spring:
rabbitmq:
host: 114.132.232.147
port: 5672
username: guest
password: guest
bindings: # 服务的整合处理
output: # 这个名字是一个通道的名称
destination: studyExchange # 表示要使用的Exchange名称定义
content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”
binder: defaultRabbit # 设置要绑定的消息服务的具体设置
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://localhost:7001/eureka
instance:
lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
instance-id: send-8801.com # 在信息列表时显示主机名称
prefer-ip-address: true # 访问的路径变为IP地址
5.业务类
5.1发送消息的接口
public interface IMessageProvider {
public String sed();
}
5.2 发送消息的实现类
@EnableBinding(Source.class) // 定义消息的推送管道
public class IMessageProviderImpl implements IMessageProvider {
@Resource
private MessageChannel output; // 消息发送管道
@Override
public String sed() {
String serial = UUID.randomUUID().toString();
output.send(MessageBuilder.withPayload(serial).build());
System.out.println("*********serial:"+serial);
return null;
}
}
6.controller
@RestController
public class SendMessageController {
@Resource
private IMessageProvider provider;
@GetMapping("/sendMessage")
public String sedMessage(){
return provider.sed();
}
}
访问接口: http://localhost:8801/sendMessage
不断刷新该接口可以看到流量波峰