2012-04-13 5 views
2

Ich bin ein Neuling zu Lambdaj. Es scheint, dass dies ein großartiges Feature für Java-Programmierung ist.Einfache Select-Methode (Lambdaj) bekommt Ausnahme

Also habe ich ein sehr einfaches Programm zur Auswertung erstellt.

Aber ich habe eine Ausnahme für Codes unten. Kannst du mir helfen, was falsch ist?

--EDITED hinzugefügt kein Argument Konstruktor und öffentliche Variable für Klasse X eingekapselt. Danke @AVD.

import java.util.Arrays; 
import java.util.List; 

import static ch.lambdaj.Lambda.having; 
import static ch.lambdaj.Lambda.on; 
import static ch.lambdaj.Lambda.select; 

public class Main { 

    private static class X { 
     private String name; 
     public X(){ 
     } 
     public X(String name) { 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 
    } 

    public static void main(String[] args) { 
     List<X> xs = Arrays.asList(
       new X("aaa"), 
       new X("aaa"), 
       new X("bbb") 
     ); 

     List<X> s = select(xs, having(on(X.class).getName().equals("aaa"))); 

    } 
} 

Ergebnis ist:

Exception in thread "main" ch.lambdaj.function.argument.ArgumentConversionException: Unable to convert the placeholder false in a valid argument 
    at ch.lambdaj.function.argument.ArgumentsFactory.actualArgument(ArgumentsFactory.java:92) 
    at ch.lambdaj.function.matcher.HasArgumentWithValue.havingValue(HasArgumentWithValue.java:70) 
    at ch.lambdaj.function.matcher.HasArgumentWithValue.havingValue(HasArgumentWithValue.java:58) 
    at ch.lambdaj.Lambda.having(Lambda.java:1193) 
    at Main.main(Main.java:34) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
+0

Fügen Sie Konstruktor ohne Argumente und Getter/Setter hinzu. – adatapost

+0

@AVD Vielen Dank für Ihre Hilfe. Ich habe bearbeitet. NullPointerException ist verschwunden, aber jetzt habe ich eine andere. – user1209133

+0

Kein Argument Konstruktor ist nicht erforderlich. – dash1e

Antwort

4

ändern Ausdruck auf diese Weise

List<X> s = select(xs, having(on(X.class).getName(), Matchers.equalTo("aaa"))); 

und es wird funktionieren.

können Sie Ihren Ausdruck nur verwenden, wenn

on(X.class).getName() 

kehrt direkt ein boolescher Wert, zum Beispiel

List<X> s = select(xs, having(on(X.class).isLowerCaseString()); 

wo isLowerCaseString() ein Verfahren zur Herstellung X ist, die true zurückgibt, wenn alle Namen Buchstaben lowecase werden .

+0

Es funktioniert. Danke für Ihre Hilfe! – user1209133

+0

Ich hatte das gleiche Problem. Endlich fand ich heraus, dass enum im Lambdaj nicht funktioniert und musste es in Klasse ändern. https://code.google.com/p/lambdaj/issues/detail?id=48 –

+0

Aber dann hat mein jaxB nicht funktioniert. Also bezog ich mich auf die Apache-Alternative anstelle von Lambdaj. –