是否有更好的功能方式将"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) 是否可以编写一个Avro架构/ IDL来生成扩展基类或实现接口的Java类?似乎生成的Java类扩展了org.apache.avro.specific.SpecificRecordBase
.因此,工具可能是要走的路.但是,我不知道这是否可行.
我已经看到了一些示例,其中提出了在每个特定模式中定义显式"类型"字段的建议,其中包含的关联多于继承语义.
我在我的工厂类和代码的其他部分中大量使用我的基类<T extends BaseObject>
.目前,我有从JSON Schema生成的代码,它支持继承.
另一个问题是:你可以使用IDL来定义没有协议定义的记录吗?我认为答案是否定的,因为编译器抱怨缺少协议关键字.
帮助赞赏!谢谢.
我有一个包含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
我正在尝试实施一个基本的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) 我试图了解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)
上面的代码行最终给了类强制转换异常。
为了解决此问题,我一直在考虑使用自定义转换器,但是如果上面的代码行不使用转换器,那将无法正常工作。
当然,我总是可以在我的自定义映射器中执行此操作,但是只是试图了解如何为类型转换生成代码。
谢谢!!
java ×2
apache-storm ×1
avro ×1
jackson ×1
java-8 ×1
java-stream ×1
lambda ×1
mapping ×1
orika ×1