小编bsa*_*sam的帖子

使用Java 8 Lambda表达式将String数组转换为Map

是否有更好的功能方式将"key:value"形式的字符串数组转换为Map使用Java 8 lambda语法?

Arrays.asList("a:1.0", "b:2.0", "c:3.0")
        .stream()
        .map(elem -> elem.split(":")
        .collect(Collectors.toMap(keyMapper?, valueMapper?));
Run Code Online (Sandbox Code Playgroud)

我现在的解决方案似乎没有真正的功能:

Map<String, Double> kvs = new HashMap<>();
Arrays.asList("a:1.0", "b:2.0", "c:3.0")
        .stream()
        .map(elem -> elem.split(":"))
        .forEach(elem -> kvs.put(elem[0], Double.parseDouble(elem[1])));
Run Code Online (Sandbox Code Playgroud)

java lambda functional-programming java-8 java-stream

32
推荐指数
1
解决办法
4万
查看次数

Avro模式中的多态性和继承

是否可以编写一个Avro架构/ IDL来生成扩展基类或实现接口的Java类?似乎生成的Java类扩展了org.apache.avro.specific.SpecificRecordBase.因此,工具可能是要走的路.但是,我不知道这是否可行.

我已经看到了一些示例,其中提出了在每个特定模式中定义显式"类型"字段的建议,其中包含的关联多于继承语义.

我在我的工厂类和代码的其他部分中大量使用我的基类<T extends BaseObject>.目前,我有从JSON Schema生成的代码,它支持继承.

另一个问题是:你可以使用IDL来定义没有协议定义的记录吗?我认为答案是否定的,因为编译器抱怨缺少协议关键字.

帮助赞赏!谢谢.

avro

23
推荐指数
2
解决办法
9848
查看次数

杰克逊反序列化convertValue vs readValue

我有一个包含JSONObjects的org.json.JSONArray,我正在尝试将它们映射到POJO.我知道我要映射到的POJO的类型.我有2个选项,我试图找出哪个性能更好.

选项1:

ObjectMapper mapper = new ObjectMapper();
ObjectReader reader = mapper.reader().withType(MyPojo.class);

for (int i = 0; i < jsonArr.length(); i++) {
    JSONObject obj = jsonArr.getJSONObject(i);
    MyPojo pojo = reader.readValue(obj.toString());

    ... other code dealing with pojo...
}
Run Code Online (Sandbox Code Playgroud)

选项2:

ObjectReader mapper = new ObjectMapper();

for (int i = 0; i < jsonArr.length(); i++) {
    JSONObject obj = jsonArr.getJSONObject(i);
    MyPojo pojo = mapper.convertvalue(obj, MyPojo.class);

    ... other code dealing with pojo...
}
Run Code Online (Sandbox Code Playgroud)

为了论证,我们假设JSONArray的长度为100.

从我迄今为止看到的源代码看,选项1似乎更好,因为反序列化上下文和反序列化器只创建一次,而在选项2的情况下,它将在每次调用时完成.

思考?

谢谢!

java serialization jackson deserialization json-deserialization

6
推荐指数
1
解决办法
6430
查看次数

HttpClient不可序列化异常

我正在尝试实施一个基本的1喷口 - 1螺栓风暴拓扑.我有一个Storm Bolt使用Apache HttpClient(4.3.1)发出HTTP请求.但是,当我运行它时,我得到以下异常:

[main] ERROR org.apache.zookeeper.server.NIOServerCnxn  - Thread Thread[main,5,main] died
java.lang.RuntimeException: java.io.NotSerializableException: org.apache.http.impl.client.InternalHttpClient
    at backtype.storm.utils.Utils.serialize(Utils.java:56)
    at backtype.storm.topology.TopologyBuilder.createTopology(TopologyBuilder.java:89)
    at app.storm.StormTopology.main(StormTopology.java:26)
Caused by: java.io.NotSerializableException: org.apache.http.impl.client.InternalHttpClient
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
    at backtype.storm.utils.Utils.serialize(Utils.java:52)
    ... 2 more 
Run Code Online (Sandbox Code Playgroud)

有人见过这个吗?我知道Storm本身在内部使用HTTP Client(4.1.1).我试图用4.3.1版本替换内部库,我又得到了一个错误:

Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:72)
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:84)
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:59)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:487)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:147)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:136)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:112)
    at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:727)
    at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
    at app.storm.bolts.DataFetcherBolt.<init>(DataFetcherBolt.java:34)
    at app.storm.StormTopology.main(StormTopology.java:18)
Run Code Online (Sandbox Code Playgroud)

apache-httpclient-4.x apache-storm

3
推荐指数
1
解决办法
4400
查看次数

Orika如何决定何时使用转换器

我试图了解Orika何时使用转换器进行映射而不是直接转换。

我有以下映射:

Class A {
  Map<String, Object> props;

}

Class B {
   String bStr;
   int bInt;

}
Run Code Online (Sandbox Code Playgroud)

我的映射定义为props ['aStr'] => bStr和props ['aInt'] => bInt

当查看生成的代码时,我发现对于String情况,它使用一个转换器并调用其convert方法进行转换:

destination.setBStr("" + ((ma.glasnost.orika.Converter)usedConverters[0]).convert(
        ((java.lang.Object) ((java.util.Map) source.getProps().get("aStr"),
        (ma.glasnost.orika.metadata.Type) usedTypes[0]))
Run Code Online (Sandbox Code Playgroud)

但是,对于整数情况,它将直接像这样进行转换:

 destination.setBInt((java.lang.Integer)(java.lang.Object) ((java.util.Map)
     source.getProps().get("aInt")))
Run Code Online (Sandbox Code Playgroud)

上面的代码行最终给了类强制转换异常。

为了解决此问题,我一直在考虑使用自定义转换器,但是如果上面的代码行不使用转换器,那将无法正常工作。

当然,我总是可以在我的自定义映射器中执行此操作,但是只是试图了解如何为类型转换生成代码。

谢谢!!

mapping type-conversion orika

0
推荐指数
1
解决办法
4023
查看次数