2012-04-13 43 views
2

我是lambdaj的新手。這似乎是Java編程的一大特色。簡單的選擇方法(lambdaj)得到異常

所以我創建了一個非常簡單的評估程序。

但我在下面的代碼中遇到了異常。你能幫我解決什麼問題嗎?

--EDITED沒有加入參數的構造函數和封裝類X. 感謝@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"))); 

    } 
} 

結果是:

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

添加無參數構造函數和getter/setter。 – adatapost 2012-04-13 03:16:39

+0

@AVD謝謝你的幫助。我編輯過。 NullPointerException消失,但現在我得到了另一個。 – user1209133 2012-04-13 07:28:33

+0

沒有參數構造函數是沒有必要的。 – dash1e 2012-04-13 13:12:38

回答

4

更改您表達這樣

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

,它會工作。

你可以用你的表情只有

on(X.class).getName() 

直接返回一個布爾值,例如

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

其中isLowerCaseString()X返回true的方法,如果所有的名稱字母lowecase 。

+0

它的工作原理。感謝您的幫助! – user1209133 2012-04-16 01:09:10

+0

我有同樣的問題。最後發現enum在lambdaj中不起作用,不得不將其更改爲class。 https://code.google.com/p/lambdaj/issues/detail?id=48 – 2015-08-31 22:20:07

+0

但後來我的jaxB沒有工作。所以我提到了Apache的替代方案,而不是lambdaj。 – 2015-08-31 22:36:51