小编Cra*_*ino的帖子

如果存在,则如何更新地图中的值,否则插入它

我做了一个搜索,并惊讶于之前没有被问过(至少我找不到它).

我有这样的地图:

Map<String, String> myMap
Run Code Online (Sandbox Code Playgroud)

我知道我可以检查地图中是否存在一个键containsKey(Object key);,我可以使用替换值replace(String key, String value);并自然地使用值put(String key, String value);

现在,如果我想检查一个值,如果它存在更新它,否则插入它,我必须使用一个条件:

if(myMap.containsKey(key)) {
    myMap.replace(key, value);
} else {
    myMap.put(key, value);
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?我个人认为这种情况有点不必要,并且过于复杂,可能只有一行而不是五行!

java

10
推荐指数
2
解决办法
2万
查看次数

在客户端关闭连接后,防止Jersey服务器保持线程活动

我正在开发一个小应用程序,它需要使用Jersey 2.0(版本2.19)从REST端点向客户端传输不同长度的输出.虽然由于客户端应用程序的现有框架而不太理想,但客户端可以随时取消请求.

我可以使用StreamingOutput成功返回流输出,如下面的代码所示.

@GET
public Response test() {

        StreamingOutput stream = new StreamingOutput() {
            @Override
            public void write(OutputStream os) throws IOException, WebApplicationException {

                Writer writer = new BufferedWriter(new OutputStreamWriter(os));

                for (int i = 0; i < 500000; i++) {
                    LOGGER.info(Integer.toString(i));
                    writer.write(String.valueOf(i) + "\n");
                    writer.flush();
                }

                writer.close();
            }
        };

        return Response.ok(stream).build();
}
Run Code Online (Sandbox Code Playgroud)

当我从客户端调用端点并让它完成时(所以从0到499999返回数字)我没有遇到任何问题,并且没有线程保存在Tomcat内存中(如Tomcat管理器中所示).
但是,如果客户端在完成之前取消请求,则该过程不再继续(通过将i记录到日志文件中看到),但是根据Tomcat管理器,它仍然保持一个线程,线程时间增加但是字节发送保持不变,这些坚持,并在一段时间后不要超时.在应用程序日志或Tomcat日志中没有抛出和记录异常,但是在停止Tomcat时,您可以在tomcat日志中看到对这些线程的引用,说它可能会导致内存泄漏:

SEVERE: The web application [/streaming-1.0-SNAPSHOT] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@27d415d9]) and a value of type [org.glassfish.jersey.process.internal.RequestScope.Instance] (value [Instance{id=3ad9c61c-22cd-40d5-b810-59bff3feafa9, referenceCounter=2, store size=4}]) but …
Run Code Online (Sandbox Code Playgroud)

java tomcat jersey jersey-2.0

5
推荐指数
1
解决办法
851
查看次数

标签 统计

java ×2

jersey ×1

jersey-2.0 ×1

tomcat ×1