I am deserializing json that contains instances of many different classes, using gson. The following works as long as I know all the classes up front:
String receivedPayloadStr = receivedMessage.get("payload");
Type payloadType = getType(receivedMessage.get("type").toString());
Object typedPayload = gson.fromJson(payloadJson, payloadType);
System.out.println(typedPayload);
Run Code Online (Sandbox Code Playgroud)
My getType function is as follows:
static Type getType(String typeName){
switch (typeName){
case "mypackage1.MyThing1":
return new TypeToken<MyThing1>() {}.getType();
case "mypackage2.MyThing1":
return new TypeToken<MyThing2>() {}.getType();
default:
throw new RuntimeException("Unsupported type: " + typeName);
}
}
Run Code Online (Sandbox Code Playgroud)
短期有效,但既丑陋又脆弱。显然,我们想要一种更易于维护的方法。有没有办法以通用方式实现 getType ,以便支持所有已知类?
编辑:我们不仅限于 gson。如果另一个库使任务更容易,我们可以切换到它。
我编写基于Java SE 8的桌面应用程序。它有我的应用程序附带的Derby DB (v10.13.1.1)。我使用Hibernate ORM框架 (v5.2.10.Final) 与 DB 进行通信,并使用Spring框架 (spring-orm @ v4.3.7.RELEASE),这也有助于它。
如果我一次将我的应用程序作为一个实例运行,一切都很好 - 数据库不会引起任何问题。但是,如果我创建应用程序的多个实例,或者同时使用数据库客户端 DBeaver 访问数据库,则会导致以下异常:
[AWT-EventQueue-0] DEBUG (124 : 2017-07-28 22:14:57,245) org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Unable to acquire JDBC Connection [n/a]
java.sql.SQLException: Failed to start database 'M_Vezelis_Draw_DB_1_6v.db' with class loader sun.misc.Launcher$AppClassLoader@73d16e93, see the next exception for details.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.seeNextException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source)
at org.apache.derby.jdbc.InternalDriver$1.run(Unknown Source)
at org.apache.derby.jdbc.InternalDriver$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at …Run Code Online (Sandbox Code Playgroud) 我对 Collectors.toList() 和 Collectors.toSet() 静态方法很困惑。这两种方法不接受任何参数。那么他们怎么知道要返回什么类型的 Collector 呢?
例如,如果我们有这一行:
Collectors.toList();
Run Code Online (Sandbox Code Playgroud)
返回的收集器是Collector<Object,?,List<Object>>。
如果我们有这一行:
Collector<Integer,?,List<Integer>> c = Collectors.toList();
Run Code Online (Sandbox Code Playgroud)
然后 Collectors.toList() 将返回一个Collector<Integer,?,List<Integer>>. 在不接受任何输入参数的情况下, toList() 方法如何知道它需要返回一个Collector<Integer,?,List<Integer>>?
也许如何编写 toList() 的示例代码对我的理解会有所帮助。
提前致谢。
我有Map以下结构,我想翻转键和值。
Map<String, List<String>> dataMap
Run Code Online (Sandbox Code Playgroud)
样本数据 :
acct01: [aa, ab, ad],
acct02: [ac, ad]
acct03: [ax, ab]
Run Code Online (Sandbox Code Playgroud)
想要将这些数据转换为,
aa: [acct01],
ab: [acct01, acct03],
ac: [acct02],
ad: [acct01, acct02],
ax: [acct03]
Run Code Online (Sandbox Code Playgroud)
想知道有没有java 8-stream的方式来转换Map。
我当前的实现(没有流)
Map<String, List<String>> originalData = new HashMap<String, List<String>>();
originalData.put("Acct01", Arrays.asList("aa", "ab", "ad"));
originalData.put("Acct02", Arrays.asList("ac", "ad"));
originalData.put("Acct03", Arrays.asList("ax", "ab"));
System.out.println(originalData);
Map<String, List<String>> newData = new HashMap<String, List<String>>();
originalData.entrySet().forEach(entry -> {
entry.getValue().forEach(v -> {
if(newData.get(v) == null) {
List<String> t = new ArrayList<String>();
t.add(entry.getKey());
newData.put(v, t);
} else { …Run Code Online (Sandbox Code Playgroud) 我有一个流,我需要在这个流的索引处获取元素
list.get(index)
我有一个包含多个条目的 LinkedHashMap。我想在第一步中将多个条目减少为单个条目,然后将其映射到单个字符串。例如:我从这样的地图开始:
{"<a>"="</a>", "<b>"="</b>", "<c>"="</c>", "<d>"="</d>"}
Run Code Online (Sandbox Code Playgroud)
最后我想得到一个这样的字符串:
<a><b><c><d></d></c></b></a>
Run Code Online (Sandbox Code Playgroud)
(在这种情况下,字符串按顺序包含键,而不是按相反顺序包含值。但这并不重要,我想要一个通用的解决方案)
我想我需要map.entrySet().stream().reduce(),但是我不知道在reduce方法中写什么,以及如何继续。
不久前,我发现了以下有关使用 Java 8 初始化地图的更简洁方法的信息:http : //minborgsjavapot.blogspot.com/2014/12/java-8-initializing-maps-in-smartest-way.html。
使用这些指南,我在一个应用程序中实现了以下类:
public class MapUtils {
public static <K, V> Map.Entry<K, V> entry(K key, V value) {
return new AbstractMap.SimpleEntry<>(key, value);
}
public static <K, U> Collector<Map.Entry<K, U>, ?, Map<K, U>> entriesToMap() {
return Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue());
}
public static <K, U> Collector<Map.Entry<K, U>, ?, ConcurrentMap<K, U>> entriesToConcurrentMap() {
return Collectors.toConcurrentMap((e) -> e.getKey(), (e) -> e.getValue());
}
}
Run Code Online (Sandbox Code Playgroud)
在那个应用程序中,我实现了这样的代码:
public Map<String, ServiceConfig> serviceConfigs() {
return Collections.unmodifiableMap(Stream.of(
entry("ActivateSubscriber", new ServiceConfig().yellowThreshold(90).redThreshold(80)),
entry("AddAccount", …Run Code Online (Sandbox Code Playgroud) 我有数据集 df,其内容的索引为 accountid,我也有带 accountid 的数组列表。如何过滤或映射数据集以创建仅包含基于数组列表中的 accountid 内容的新数据集。
我正在使用 Java 8
List<String> accountIdList= new ArrayList<String>();
accountIdList.add("1001");
accountIdList.add("1002");
accountIdList.add("1003");
accountIdList.add("1004");
Dataset<Row> filteredRows= df.filter(p-> df.col("accountId").equals(accountIdList));
Run Code Online (Sandbox Code Playgroud)
我正在尝试将列表本身传递给比较运算符,您认为这是正确的方法吗
Java 语法是
如果您正在寻找 java 语法
Dataset<Row> filteredRows= df.where(df.col("accountId").isin(accountIdList.toArray()));
Run Code Online (Sandbox Code Playgroud) 我想完成与这个问题相同的事情:Disable automatic Wadl Generation for OPTIONS request,但我们没有web.xml文件。我们还使用ResourceConfig,getProperties方法是最终的,所以我不能像其他问题中建议的那样覆盖它。我试过property("com.sun.jersey.config.feature.DisableWADL", "true");在我们的班级中调用extends ResourceConfig,但这没有用。
如何禁用 WADL?
我们使用的是 Jersey 2.25.1。我尝试阅读WADL 上的 Jersey 文档,但由于弹出错误消息说明了有关 syntaxhighlightingerror/xml 刷子的内容,因此无法阅读该页面。
因此,我的设置方式是,在特定条件下,我希望侦听器处于活动状态,并且在触发后,停止侦听更改。也许我遗漏了一些东西,但我似乎无法弄清楚如何使用该removeListener()功能,或者这是否是这样做的方法。
一些代码:
break1.setOnAction(e ->{
final String fieldValue = manage_money.getText();
int pp = Integer.parseInt(platinum_num.getText());
int gp = Integer.parseInt(gold_num.getText());
int sp = Integer.parseInt(silver_num.getText());
int cp = Integer.parseInt(copper_num.getText());
if (fieldValue != null && fieldValue.matches("\\d+")) {
int value = Integer.parseInt(manage_money.getText());
if (silver.isSelected()){
if (value <= sp){
try {
tooltip_inv.getChildren().addAll(select);
radio_money2.selectedToggleProperty().addListener(((observable, oldValue, newValue) -> {
if (newValue == copper){
silver_num.setText(Integer.toString(sp - value));
copper_num.setText(Integer.toString(cp + value * 10));
manage_money.clear();
tooltip_inv.getChildren().clear();
}
}));
} catch (IllegalArgumentException ex) {
}
}else{
manage_money.setText("ERR");
}
}
}else{
manage_money.setText("NaN"); …Run Code Online (Sandbox Code Playgroud) java-8 ×10
java ×5
java-stream ×4
apache-spark ×1
derby ×1
eclipse ×1
generics ×1
glassfish ×1
gson ×1
hibernate ×1
jakarta-ee ×1
javafx ×1
jersey ×1
listener ×1
spring-orm ×1