我正在寻找一种方法来调用多个参数方法,但使用一个lambda构造.在文档中,据说lambda只有在它可以映射到功能界面时才可用.
我想做的事情如下:
test((arg0, arg1) -> me.call(arg0, arg1));
test((arg0, arg1, arg2) -> me.call(arg0, arg1, arg2));
...
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以优雅地做到这一点而不定义10个接口,每个参数计数一个?
更新
我使用从非方法接口扩展的多个接口,并重载该方法.
两个参数的示例:
interface Invoker {}
interface Invoker2 extends Invoker { void invoke(Object arg0, Object arg1);}
void test(Invoker2 invoker, Object ... arguments) {
test((Invoker)invoker, Object ... arguments);
}
void test(Invoker invoker, Object ... arguments) {
//Use Reflection or whatever to access the provided invoker
}
Run Code Online (Sandbox Code Playgroud)
我希望有可能用一个解决方案替换10个调用者接口和10个重载方法.
我有一个合理的用例,请不要问诸如"你为什么要做这样的事情?"之类的问题.并且'你想解决的问题是什么?' 或类似的东西.只要知道我已经考虑过这一点,这是我试图解决的合法问题.
很抱歉添加混淆调用它调用程序,但它实际上是在我当前的用例(测试构造函数合同)中调用它.
基本上,如上所述,考虑一个在其中使用不同数量的属性的方法lambda.
我对Lisp中的lambda函数有很好的理解.Java似乎没有Lisp那样的灵活性.我如何在Java中考虑lambdas?鉴于下面的代码,我该怎么做?
public class Draw {
GraphicsContext gc;
static void draw(double x, double y, double w, double h, boolean drawRect) {
if (drawRect) {
gc.fillRect(x, y, w, h);
} else {
gc.strokeRect(x, y, w, h);
}
}
// How do I do that?
static void drawWithLambda(double x, double y, double w, double h /**, lambda */) {
lambda(x, y, w, h);
}
public static void main(String[] args) {
draw(0, 0, 50, 50, false); // OK
drawWithLambda(0, 0, 50, 50, GraphicsContext::fillRect); // …Run Code Online (Sandbox Code Playgroud) 假设我有一个List<String>和一个List<Transfomer>.我想将每个变换器应用于列表中的每个字符串.
使用Java 8 lambdas,我可以这样做:
strings.stream().map(s -> {
for(Transformer t : transformers) {
s = t.apply(s);
}
return s;
}).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
但我想做更像这样的事情,但是它会导致编译时错误:
strings.stream().map(s -> transformers.stream().forEach(t -> s = t.apply(s))).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
我刚刚开始玩lambdas,所以也许我只是没有正确的语法.
我有以下方法:
public String getAllDangerousProductsName(Offer offer){
return offer.getOfferRows().stream()
.filter(row -> row.isDangerousGood())
.map(row -> row.getItemInformation().getOfferTexts().getName())
.collect(Collectors.joining(","));
}
Run Code Online (Sandbox Code Playgroud)
我想为 row.isBulkyGood() 重用这个方法。我目前正在做的是
public String getAllBulkyProductsName(Offer offer){
return offer.getOfferRows().stream()
.filter(row -> row.isBulkyGood())
.map(row -> row.getItemInformation().getOfferTexts().getName())
.collect(Collectors.joining(","));
}
Run Code Online (Sandbox Code Playgroud)
...这基本上是代码重复。有没有办法可以将函数作为方法参数传递来优化它,以便对两种过滤条件都有一种方法?
我正在使用JavaFX来渲染一些SVG的东西.我定义了很多方法,返回不同SVG形状的路径(省略号,圆形,矩形,线条等).除线法外,所有这些似乎都有效.JavaFX不会返回错误(意味着路径可能正确),但它不会绘制任何内容.这是我的方法.
public static SVGPath line(float startX, float endX, float startY, float endY, PositionType positionType)
{
SVGPath path = new SVGPath();
path.setContent(positionType.getMoveto()+startX+","+startY+positionType.getLineto("l")+endX+","+endY);
return path;
}
Run Code Online (Sandbox Code Playgroud)
该方法getMoveto()返回M或m,取决于PositionType,并getLineto()返回L或l.
这是一个示例方法调用:
SVGPath test2 = SVGPrimitives.line(20f, 30.1f, 23f, 89.21f, PositionType.ABSOLUTE);
Run Code Online (Sandbox Code Playgroud)
以下是返回的路径:
M20.0,23.0 L 30.1,89.21
Run Code Online (Sandbox Code Playgroud)
这似乎对我有用,但没有任何内容......
我有两个类A和B,就像这样:
class A {
public Integer fetchMax() {
// Make a network call & return result
}
}
class B {
public Double fetchPercentile(Integer input) {
// Make a network call & return result
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我需要提供retry这两种方法的机理fetchMax()及fetchPercentile(Integer).我想使用一个helper类来提供这种行为,其中retry可以采用instance(A或B)的方法,method-name和method-arguments.重试基本上会对提供的对象方法进行重新尝试.
像这样的东西:
class Retry {
public static R retry(T obj, Function<T, R> method, Object... arguments) {
// Retry logic
while(/* retry condition */)
{ …Run Code Online (Sandbox Code Playgroud) 我在这里问:https://stackoverflow.com/questions/36385548/how-to-programmatically-construct-a-lambda-in-java-8但我想知道是否有替代方法可以在clojure中构建lambdas.
对于用例,我试图包装rethinkdb库:http://www.rethinkdb.com/api/java/#map
我可能错了,但是在rethinkdb驱动程序中,不知何故lambdas被编译成ast语法,转换为js并发送到数据库.我相信我需要以某种方式明确地创建一个lambda.http://www.rethinkdb.com/blog/lambda-functions/ 所以这个问题如何在Clojure中将lambda实现为一个名为"lambda"的函数?仅显示如何使用函数,而不是lambda.