Akka:自定义HttpHeader,在java中将HashMap转换为可迭代< HttpHeader>

wwwo4jvm  于 2022-11-23  发布在  Java
关注(0)|答案(2)|浏览(368)

我正在尝试用akka生成自定义HttpHeader。我有一个头条目的HashMap,我需要将其转换为Iterable。下面是我的代码:

import akka.http.javadsl.model.HttpHeader;
HashMap<String, String> headersMap = new HashMap<>();
headersMap.put("key1","value1");
return (Iterable<HttpHeader>) headersMap;
//HttpRequest.create().withUri("uri").addHeaders(Iterable<HttpHeader> iterable)
public static Iterable<HttpHeader> convertToRecordHttpHeaders(Map<String, String> headersMap){
    return headersMap.entrySet().stream()
            .map(x -> new HttpHeader(x.getKey(), x.getValue()))
            .collect(Collectors.toList());
}

当我想在akka中创建一个HttpRequest时,将map转换为HttpHeader并将其转换为Iterable的有效方法是什么?
解决方案:使用RawHeader将标题添加到请求

request.addHeader(RawHeader.create("key","value"));
czfnxgou

czfnxgou1#

HashMap不是Iterable。它是entrySet()keySet()values(),但对于你的Map,它们分别是Iterable<Map.Entry<String, String>>Iterable<String>Iterable<String>。这意味着你不能以任何方式将Map转换为Iterable<HttpHeader>
您可以转换:

List<HttpHeader> headersList = headersMap.entrySet().stream()
        .map(entry -> new HttpHeader(entry.getKey(), entry.getValue())
        .collect(Collectors.toList()); // or just toList() with Java 17

这里假设HttpHeader有一个接受头文件名和值的构造函数,如果没有,就用创建HttpHeader的其他函数替换构造函数调用。

kninwzqo

kninwzqo2#

假设Header类如下所示

class HttpHeader{
    public HttpHeader(Map.Entry<String,String> header){}
}

那么就使用构造函数引用来代替lambda,或者可以使用lambda表达式提供解析
headersMap.entrySet().stream().map(HttpHeader::new).iterator();
但是我仍然不理解为返回HttpHeader迭代器创建HashMap的用例。
我猜你曾经保持头键唯一的vivaMap,但是你可以使用TreeSet,将保持唯一的对象太多

class HttpHeader implements Comparable<HttpHeader>{
    String key;
    String value;
    
    public HttpHeader(String key, String value){
        this.key = key;
        this.value = value;
    }

    @Override
    public int compareTo(HttpHeader o) {
        return key.compareTo(o.key);
    }
}

相关问题