11

デバッグの目的でPredicate、Java 8 でラムダ式 (特に s ですが、他のラムダ式でも興味深いでしょう) の文字列表現を作成しようとしています。私の考えは次のようになります。

public class Whatever {

    private static <T> String predicateToString(Predicate<T> predicate) {
        String representation = ... // do magic
        return representation;
    }

    public static void main(String[] args) {
        System.out.println(Whatever.<Integer>predicateToString(i -> i % 2 == 0));
    }

}

そして、出力はi -> i % 2 == 0(または論理的に同等のもの)になります。メソッドは役に立たないようです。toString()出力は次のようなものです(オーバーライドされていないcom.something.Whatever$$Lambda$1/1919892312@5e91993fため、予想されると思います)。toString()

このようなことが可能かどうかはわかりません。たとえば、リフレクションを使用すると、これまでのところ何も見つかりませんでした。何か案は?

4

1 に答える 1

21

私が思いついた最も簡単なことは、述語に名前または説明を与える「名前付き述語」を作成することです。基本的には、次のように役立ちますtoString

public class NamedPredicate<T> implements Predicate<T> {
    private final String name;
    private final Predicate<T> predicate;

    public NamedPredicate(String name, Predicate<T> predicate) {
        this.name = name;
        this.predicate = predicate;
    }

    @Override
    public boolean test(T t) {
        return predicate.test(t);
    }

    @Override
    public String toString() {
        return name;
    }

    public static void main(String... args) {
        Predicate<Integer> isEven = new NamedPredicate<>("isEven", i -> i % 2 == 0);
        System.out.println(isEven); // prints isEven
    }
}

ほぼ間違いなく、次のように述語に名前または説明を付けると、それらを使用するコードが少し理解しやすくなります。

Stream.of(1, 2, 3, 4)
        .filter(isEven)
        .forEach(System.out::println);

より奇妙なアイデアは、述語の「構造的」記述を導き出すことかもしれません。つまり、与えられた入力に対する出力は何ですか? 明らかに、これは入力セットが有限で小さい場合 (たとえば、列挙型、ブール値、またはその他の制限されたセットの場合) に最適に機能しますが、整数述語に対しても「ランダムな」整数の小さなセットを試すことができると思います。

private static Map<Boolean, List<Integer>> testPredicate(Predicate<Integer> predicate) {
    return Stream.of(-35, -3, 2, 5, 17, 29, 30, 460)
            .collect(Collectors.partitioningBy(predicate));
}

の場合isEven、これは のようなものを返します。これは{false=[-35, -3, 5, 17, 29], true=[2, 30, 460]}、手動で説明を与える場合よりも必ずしも明確ではないと思いますが、制御できない述語にはおそらく役立つでしょう。

于 2014-05-16T21:56:39.723 に答える