我正在尝试优化下面的代码段。我想通过使用单个循环清除java中的多个会话密钥。因此要求是我不想清除所有会话密钥,我想保留一些会话密钥。例如,在下面的代码段中,我尝试删除包含ID_NAME_
的密钥,并保留传递给方法的id。
以下是我编写的代码片段,效果很好:
private void clearPreviousIdFromSession(HttpServletRequest request, String id) {
HttpSession session = request.getSession();
Enumeration keys = session.getAttributeNames();
ArrayList<String> keyArrs = new ArrayList<>();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
System.out.println("Keys for session : " + key);
if (key.contains("ID_NAME_"+id)) {
continue;
} else if(key.contains("ID_NAME_")) {
keyArrs.add(key);
}
}
for(String k : keyArrs){
System.out.println(k);
session.setAttribute(k, null);
session.removeAttribute(k);
}
}
下面是我试图将其转换为单个循环的代码,但是因为removeAttribute()
而导致错误,将从此会话中删除与指定名称绑定的对象。在这种情况下,我认为key
将被删除,并且无法检查列表中的nextElement。
private void clearPreviousIdFromSession(HttpServletRequest request, String id) {
HttpSession session = request.getSession();
Enumeration keys = session.getAttributeNames();
//ArrayList<String> keyArrs = new ArrayList<>();
String key;
while (keys.hasMoreElements()) {
key = (String) keys.nextElement();
System.out.println("Keys for session : " + key);
if (key.contains("ID_NAME_" + id)) {
continue;
} else if (key.contains("ID_NAME_")) {
session.removeAttribute(key);
}
}
}
答案 0 :(得分:2)
您希望优化已经精心设计的内容
由于您不应在迭代过程中删除元素,因此需要将要删除的元素收集到List中,并在迭代后迭代此List以删除它们。
这种方法很好,逻辑流程也是“优化的”。
如果您必须真正更改实际代码中的内容,则可能是冗余操作:
session.setAttribute(k, null);
session.removeAttribute(k);
您应该只选择其中一个:
for(String k : keyArrs){
System.out.println(k);
session.removeAttribute(k);
}
因为session.setAttribute(k, null)
与调用session.removeAttribute(k)
具有相同的效果。
答案 1 :(得分:1)
if (key.contains("ID_REPO_" + id)) {
continue;
} else if (key.contains("ID_REPO_")) {
session.removeAttribute(key);
}
将此重构为java流:
key.stream()
.filter(key -> !key.contains("ID_REPO_" + id)) //filter all keys that do not have string
.forEach(key -> session.removeAttribute(key)) // execute lambda on every key filtered