2017-12-04 26 views
-1

Fist von allem, ich bin ziemlich neu in Java mein Ansatz für das Problem möglicherweise nicht optimal sein.Wert hinzufügen Hashtable mit Lambda

Ich habe einige Listen von Zeichenketten, sagen {"a", "b", "e", "g"} und {"no", "a", "g", "great"}, die enthalten 4 Artikel jeweils aus einer Reihe von Werten.

Ich mag ein Hashtable diesen Satz erstellen, einen int Wert jeden String zuweisen. Für einen bestimmten String möchte ich einen Lambda-Ausdruck verwenden verschiedene Werte es basierend auf den andere Gegenstände zuweisen in der Liste, um es in enthalten ist, so etwas wie:

class bla { 
    static Map stuff; 
    static { 
     // If I write it like this, I get the error "Cannot resolve method ContainsAll" 
     stuff.put("g", (aList) -> (aList.containsAll(Arrays.asList("a", "b", "e", "g")) ? 1 : 2)); 
    } 
} 

Wenn ich fügen Sie eine List<String> zu wie so, (List <String> aList) dann bekomme ich eine "Zieltyp eines Lambda-Ausdruck muss eine Schnittstelle sein" Fehler.

Wenn ich () mit {} für den Lambda-Körper ersetzen, erhalte ich den „, erwartete Fehler“.

Wie kann ich das schreiben, um zu arbeiten? Oder hast du eine bessere Idee?

+4

Sie scheinen zufällige Dinge zu versuchen, anstatt das Javadoc der Klassen zu lesen, die Sie verwenden. Erster Hinweis: Keine Methode im JDK beginnt jemals mit einem Großbuchstaben. –

+0

^und Sie werden fast sicher kein Lambda brauchen, um zu tun, was Sie wollen. – EvanM

+1

Verwenden Sie auch keine Rohtypen. Sie möchten eine Karte . Keine Karte. –

Antwort

0

Dies sollte den Trick für Sie tun.

Oh, und Sie wollen ein Map<String,Integer>, kein Hashtable. Hashtable ist nicht veraltet, aber sehr schlecht und langsam für die meisten Ihrer Anwendungsfälle.

import java.util.*; 
import java.util.function.*; 
import java.util.stream.*; 
public class Main { 
    public static void main(String[] args) { 
    Map<String,Integer> map = Stream.of("no", "a", "g", "great") 
     .collect(Collectors.toMap(
     Function.identity(), 
     x -> Arrays.asList("a", "b", "e", "g").contains(x) ? 1 : 2 
    )); 
    System.out.println(map); 
    } 
} 

Ausgang:

{a=1, no=2, g=1, great=2} 
+0

Danke, aber es scheint, ich habe mich nicht klar gemacht.Also habe ich eine Menge Strings, die ich als Schlüssel in einer HashMap verwenden möchte, denen ich Werte zuweise. Ich habe auch einige Listen einer festen Anzahl von Strings, sagen wir 4, und von diesen möchte ich neue Listen von Ganzzahlen basierend auf den Werten in der HashMap erstellen. Einer oder mehrere Strings müssen unterschiedliche Werte zugewiesen haben, wenn sie Teil einer bestimmten Liste sind (sie bestehen aus bestimmten Strings, nicht in irgendeiner Reihenfolge). Ich hoffe, dadurch wurde es klarer. –

0

fand ich meinen Fehler .. endlich. Ich weiß, dass der Code, den ich geschrieben eher eine Idee war ich wollte und ich war auf dieser Linie konzentriert:

stuff.put("g", (aList) -> (aList.containsAll(Arrays.asList("a", "b", "e", "g")) ? 1 : 2)); 

Ich erkennen die HashMap als Karte (String, Schnittstellenname) definiert werden muss, und nicht (String, Integer):

interface Something{ 
    int doStuff(List<String> blabla); 
} 

class bla{ 
    static Map<String, Something> stuff; 
    static{ 
     stuff = new HashMap<>(); 
     stuff.put("a", (List<String> aList) -> 30); 
     stuff.put("g", (List<String> aList) -> aList.containsAll(Arrays.asList("a", "b", "e", "g")) ? 10 : 25); // I only need this for a few of the strings 
    } 
} 
Verwandte Themen