2017-08-28 3 views
0

Ich versuche, das untenstehende Code-Snippet zu optimieren. Ich möchte mehrere Session-Schlüssel in Java löschen, indem Sie eine einzelne Schleife verwenden. Also die Anforderung ist, dass ich nicht alle Sitzungsschlüssel löschen möchte, ich möchte einige der Sitzungsschlüssel behalten. Im unten stehenden Codefragment versuche ich beispielsweise, Schlüssel zu entfernen, die ID_NAME_ enthalten, und halte den Schlüssel mit der ID, die an die Methode übergeben wurde.Wie effizient löschen mehrere Sitzungsschlüssel in Java?

Unten ist der Code-Schnipsel I, die gut funktioniert hat geschrieben:

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); 
     } 

    } 

Unten ist der Code, den ich versuchte, es in eine einzige Schleife zu machen, aber einen Fehler bekommen, weil removeAttribute() die mit dem gebundenen Objekt entfernen Name aus dieser Sitzung angegeben. In diesem Fall denke ich, dass key entfernt wird und nicht in der Lage sein wird, nach dem nextElement in der Liste zu suchen.

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); 

      } 

     } 

    } 

Irgendwelche Vorschläge, um meinen Code zu verbessern. Ich habe versucht, here und einige alte Fragen von Stack-Überlauf Fragen und here suchen, aber immer noch Schwierigkeiten haben. TIA

+1

Kann "ID_NAME_" oder "ID_REPO_" wirklich überall in der Zeichenfolge erscheinen? Wenn sie nur am Anfang erscheinen können, solltest du 'startsWith' anstelle von' contains' verwenden, sowohl für die Performance (Moll) als auch damit du keine schlechte Überraschung bekommst (!). Warum nennst du deine Liste 'keyArrs'? Bist du ein Pirat? Ich würde es nur 'Schlüssel' nennen. –

+1

Ja @DavidConrad, "ID_NAME" erscheint am Anfang der Zeichenfolge. Ich kann startsWith verwenden. Danke, dass du darauf hingewiesen hast. Außerdem muss ich 'keyArrs' für die zweite Lösung nicht verwenden. Ich verwende bereits "Schlüssel" für die Aufzählung in der ersten Lösung. Ich weiß, dass ich eine bessere Namenskonvention hätte verwenden sollen. – Techiee

Antwort

2

Sie möchten etwas optimieren, das bereits gut entworfen ist.
Da Sie während der Iteration keine Elemente entfernen sollten, sammeln Sie Elemente, die in eine Liste gelöscht werden sollen, und nach Iteration durchlaufen Sie diese Liste, um sie zu löschen.
Dieser Ansatz ist nett und der logische Ablauf ist "optimiert".

Wenn Sie wirklich mußten etwas in dem eigentlichen Code ändern, könnte es der redundante Betrieb sein:

session.setAttribute(k, null); 
session.removeAttribute(k); 

Sie sollten nur eine von ihnen wählen:

for(String k : keyArrs){ 
    System.out.println(k); 
    session.removeAttribute(k); 
} 

seit session.setAttribute(k, null) hat die Derselbe Effekt wie der Aufruf session.removeAttribute(k).

+0

Danke David für das Aufzeigen von 'session.setAttribute (k, null)', ja, ich kann das entfernen. Aber ich überlegte, ob ich beides (gleichzeitiges Iterieren und Entfernen) gleichzeitig tun könnte. – Techiee

+1

Gern geschehen. Ich glaube nicht, dass die 'Enumeration'-Klasse nicht dafür ausgelegt ist, Elemente während der Iteration zu entfernen, wie' Iterator' dies tut. – davidxxx

1
if (key.contains("ID_REPO_" + id)) { 
       continue; 
      } else if (key.contains("ID_REPO_")) { 

       session.removeAttribute(key); 

      } 

Refactoring dies java stream:

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 
+0

Ihre Lösung sieht gut aus. Nur was ich Java 7 benutze. Kann ich das in 7 verwenden? – Techiee

Verwandte Themen