2

私はlambdajの初心者です。Javaプログラミングにとって素晴らしい機能のようです。

そこで、評価用の非常にシンプルなプログラムを作成しました。

しかし、以下のコードで例外が発生しました。何が悪いのか手伝ってくれませんか。

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

1 に答える 1

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

ここで、は、すべての名前の文字が小文字の場合にtrueを返すisLowerCaseString()メソッドです。X

于 2012-04-13T12:26:19.467 に答える