相关疑难解决方法(0)

Java Pass方法作为参数

我正在寻找一种通过引用传递方法的方法.我知道Java不会将方法作为参数传递,但是,我想获得一个替代方案.

我被告知接口是将方法作为参数传递的替代方法,但我不明白接口如何通过引用充当方法.如果我理解正确,接口只是一组未定义的抽象方法.我不希望每次都发送需要定义的接口,因为几种不同的方法可以使用相同的参数调用相同的方法.

我想要完成的是类似的事情:

public void setAllComponents(Component[] myComponentArray, Method myMethod) {
    for (Component leaf : myComponentArray) {
        if (leaf instanceof Container) { //recursive call if Container
            Container node = (Container) leaf;
            setAllComponents(node.getComponents(), myMethod);
        } //end if node
        myMethod(leaf);
    } //end looping through components
}
Run Code Online (Sandbox Code Playgroud)

调用如:

setAllComponents(this.getComponents(), changeColor());
setAllComponents(this.getComponents(), changeSize());
Run Code Online (Sandbox Code Playgroud)

java interface

254
推荐指数
10
解决办法
28万
查看次数

绑定兰斯达?

我有一个关于哪种样式是首选的问题:std :: bind Vs lambda在C++ 0x中.我知道它们服务于某些不同的目的,但我们举一个交叉功能的例子.

使用lambda:

uniform_int<> distribution(1, 6);
mt19937 engine;
// lambda style
auto dice = [&]() { return distribution(engine); };
Run Code Online (Sandbox Code Playgroud)

使用bind:

uniform_int<> distribution(1, 6);
mt19937 engine;
// bind style
auto dice = bind(distribution, engine);
Run Code Online (Sandbox Code Playgroud)

我们应该选择哪一个?为什么?假设与上述示例相比情况更复杂.即一个优于另一个的优点/缺点是什么?

c++ lambda functional-programming bind c++11

52
推荐指数
5
解决办法
3万
查看次数

有没有办法规避lambda表达式的类型?

这是一个我想知道的问题,因为lambdas是用Java引入的,并且受到相关问题的启发,我想我可以在这里提出它,看看是否有任何想法.

(附注:C#有一个类似的问题,但是我没有找到一个用于Java的问题.关于"将lambda存储在变量中"的Java问题总是指变量类型被修复的情况 - 这正是我想要绕过的东西)


Lambda表达式通过目标类型推断接收它们所需的类型.这全都由编译器处理.例如,功能

static void useF(Function<Integer, Boolean> f) { ... }
static void useP(Predicate<Integer> p) { ... }
Run Code Online (Sandbox Code Playgroud)

可以使用相同的 lambda表达式调用它们:

useF(x -> true);
useP(x -> true);
Run Code Online (Sandbox Code Playgroud)

表达式将一度表现为实现Function<Integer,Boolean>接口的类,并且一次作为实现Predicate<Integer>接口的类.

但遗憾的是,没有办法将lambda表达式存储为适用于这两种函数的类型,例如

GenericLambdaTypelambda = x -> true;

这个"通用λ型"将具有以编码的方法的类型可以由给定的λ表达式来实现.所以在这种情况下,它会

(Ljava.lang.Integer)Ljava.lang.Booleanlambda = x -> true;

(基于标准类型签名,用于说明).(这不是完全不合理的:C++ lambda表达式基本上就是这样......)


那么有什么方法可以防止lambda表达式被解析为一种特定的类型?

特别是,是否有任何技巧或解决方法允许使用相同的对象调用上面描绘的useFuseP方法,如

useF(theObject);
useP(theObject);
Run Code Online (Sandbox Code Playgroud)

这是不太可能的,所以我假设答案显然是:"不",但是:有没有办法写一个通用的,魔术适应方法,如

useF(convertToRequiredTargetType(theObject)); …
Run Code Online (Sandbox Code Playgroud)

java generics lambda casting

9
推荐指数
1
解决办法
141
查看次数