像C-style函数指针一样使用Java Lambdas?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了像C-style函数指针一样使用Java Lambdas?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2477字,纯文字阅读大概需要4分钟。
内容图文
![像C-style函数指针一样使用Java Lambdas?](/upload/InfoBanner/zyjiaocheng/789/13df476f0894420e8377b317eaf70448.jpg)
我对lambdas和Java8一般都是新手,所以如果这是一个简单的问题我会道歉.
我目前有一个课程,我希望在最后一个复杂的匹配上做一些getter:
public final class Foo {
public String getName();
public Type getType();
public List<Bar> getBarList();
....
}
我写了一个小辅助类来匹配:
public class MatchParameter<T> {
boolean expectMatch = true;
T valueToCheck;
public MatchParameter(T value, boolean shouldMatch) {
this.expectMatch = shouldMatch;
this.valueToCheck = value;
}
public boolean matches(Predicate<T> matcher) {
return matcher.test(valueToCheck) == expectMatch;
}
}
然后,我有一个地方可以创建各种MatchParameters,例如检查名称或检查List< Bar>包含一个特定的栏:
MatchParameter<String> nameParam = new MatchParameter(inputName, shouldMatch);
MatchParameter<Bar> barParam = new MatchParameter(inputBar, shouldMatch);
....
我目前卡住了记住每个MatchParameter正在寻找的东西.最终我的支票代码如下:
if(nameParam.matches(name -> currentFoo.getName().matches(name)) {
...
}
if(barParam.matches(bar -> currentFoo.getBarList().contains(bar)) {
...
}
...
在每种情况下,我传递的谓词都是一个lambda,它有一些currentFoo的迭代.< accessorFns>最终采用类型T,并返回一个布尔值.我真正想做的是将访问器的逻辑移动到MatchParameter的创建.
有没有办法可以指定一个我可以在构造时传入的函数指针?我希望它是某种可运行的(Foo,T).
在C中我添加了一个本地函数指针,它将两个输入(Foo和T)带到MatchParameter的局部变量:
bool (*checkFn)(Foo f, T input);
然后我可以为每个实例化创建一个匿名函数,并更新我的MatchParameter匹配实现为:
public boolean matches(Foo f) {
return checkFn(f, valueToCheck) == expectMatch;
}
我的实例化是:
MatchParameter<String> nameParam = new MatchParameter<>(
inputName,
shouldMatch,
(Foo f, String input) -> boolean { return f.getName().matches(input); }
);
是否有相同的方法在Java中实现这一点?
解决方法:
如果你的函数应该总是返回一个布尔值,那么你可以将BiPredicate传递给构造函数:
public class MatchParameter<T> {
boolean expectMatch = true;
T valueToCheck;
BiPredicate<Foo, T> predicate;
public MatchParameter(T value, boolean shouldMatch, BiPredicate<Foo, T> function) {
this.expectMatch = shouldMatch;
this.valueToCheck = value;
this.predicate = predicate;
}
public boolean matches(Predicate<T> matcher) {
return matcher.test(valueToCheck) == expectMatch;
}
}
然后,您可以按如下方式实例化对象:
MatchParameter<String> nameParam = new MatchParameter<>(inputName, shouldMatch,
(foo, input) -> f.getName().matches(input)
);
最后,您可以创建一个函数来测试BiPredicate到Foo对象:
public boolean matches(Foo f) {
return predicate.test(f, valueToCheck) == expectMatch;
}
内容总结
以上是互联网集市为您收集整理的像C-style函数指针一样使用Java Lambdas?全部内容,希望文章能够帮你解决像C-style函数指针一样使用Java Lambdas?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。