Spring3.x不支持stream写法

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));
}
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7690078
  • 这篇博客你也可以参考下:转:Spring 中StreamUtils教程
  • 除此之外, 这篇博客: springcloud学习笔记中的 13.3 Stream消息驱动之生产者 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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

    不断刷新该接口可以看到流量波峰

    image-20220105145539632