bla*_*dri 8 java lambda tostring predicates java-8
出于调试目的,我试图Predicate在Java 8中创建lambda表达式的字符串表示(特别是s,尽管对其他lambda表达式也很有趣).我的想法是这样的:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
输出将是i -> i % 2 == 0(或逻辑等价的东西).这个toString()方法似乎没有任何帮助,输出就是这样的com.something.Whatever$$Lambda$1/1919892312@5e91993f(我想这是预期的,因为toString()它没有被覆盖).
我不确定这样的事情是否可能,例如反射,到目前为止我当然无法找到任何东西.有任何想法吗?
and*_*ler 19
我能想到的最简单的事情是创建一个"命名谓词",为你的谓词提供一个名称或描述,基本上任何有用的东西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
}
}
Run Code Online (Sandbox Code Playgroud)
可以给出这样的谓词名称或描述,这使得使用它们的代码也更容易理解:
Stream.of(1, 2, 3, 4)
.filter(isEven)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
一个陌生人的想法可能是导出谓词的"结构"描述,即某些给定输入的输出是什么?显然,当输入集有限且很小时(例如对于枚举,布尔值或其他一些限制集),这将最有效,但我猜你也可以为整数谓词尝试一小组"随机"整数:
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));
}
Run Code Online (Sandbox Code Playgroud)
对于isEven,这将返回类似{false=[-35, -3, 5, 17, 29], true=[2, 30, 460]},我不认为一定比你手动给他们一个更清晰的描述,但对于不属于你的操控下断言或许有用.
| 归档时间: |
|
| 查看次数: |
5041 次 |
| 最近记录: |