当前位置: 首页 > 知识库问答 >
问题:

传递lambda(Object->Object)到Java中的函数[duplicate]

宫元徽
2023-03-14

下面可以看到使用的示例。我希望能够创建Foo的实例,其中每个实例都能够,在本例中,调用一个prespeficied getter函数。

java prettyprint-override">class Foo() {
public ? lambdaFunction;

public Object doSomething(Object arbitraryClass);
    return lambdaFunction(arbitraryClass);
}

foo.lambdaFunction = (Object object) -> ((SomeClass) object).getAttribite())
foo.doSomething(someClassInstance);

我有大量具有可获取属性的类,并且需要能够在不同的地方获取所有这些属性,但唯一改变的是类的getter名称。

共有1个答案

邹阳
2023-03-14
class Foo {
    private final Function<Object, ?> func;

    public Foo(Function<Object, ?> func) {
        this.func = func;
    }

    public Object doSomething(Object in) {
        return func.apply(in);
    }
}

但我怀疑你真的想那样。Java是一种名义上的类型化语言--你应该使用名字,而且有很多名字。‘对象’没有多大意义。例如,如果函数需要能够转换任何对象,那么传入的函数就不能对该对象执行任何操作(当然,除了toStringhashcode和所有对象都具有的其他方法)。函数可以强制转换输入,但这很难看。

这听起来是一个更好的计划:

class Foo<F, T> {
    private final Function<? super F, ? extends T> func;

    public Foo(Function<? super F, ? extends T> func) {
        this.func = func;
    }

    public T doSomething(F in) {
        return func.apply(in);
    }
}

F和T是“from”和“to”的缩写。为什么是?superf是因为如果您想要将字符串转换为整数,并且您有一个函数可以将任何对象转换为整数,这也很好:您希望它可以转换字符串或其任何超类型,对于“to”,任何子类型也可以。

根据您最近的评论,我将此答复引申如下:

Java不是动态类型。没有随机的mischymeat抓取函数包,这些函数可能有意义,也可能没有意义,给定所提供的输入。因此,如果您想要一个“描述一个setter的函数,例如,它接受两个输入参数”,那么这是一个完全不同的概念:这是一个需要一个接收器和一个新值来设置的函数,并且什么也不返回。2路输入,0路输出。j.u.f.function是1个输入,1个输出。

2个输入,0个输出将是java.util.function.biconsumer 。看看这些类型的java.util.function API。

class Example {
    private String name;

    public void setName(String name) { this.name = name; }
    public String getName() { return name; }

    public static final BiConsumer<Example, String> SETTER = Example::setName;
}

class SomeplaceElse {
    void foo() {
        Example e = new Example();
        String n = "hello";
        Example.SETTER.accept(e, n);
        System.out.println(e.getName()); // prints 'hello'
    }
}
 类似资料:
  • 我试图使一个异常处理程序接受不同类型的异常争论,我声明了一个函数类型,它接受扩展throwable的任何类型。它可以在声明: > 类型函数 不适用于参数(IllegalStateException) 类型不匹配:无法从函数 到函数

  • 问题内容: 我听到有人比检查更好 例如: 有什么原因还是这是另一个神话?感谢帮助。 问题答案: 这可能是从C那里学来的一种习惯,可以避免这种错字(单打而不是双打): 将常量放在左侧的约定在Java中并不是真正有用的,因为Java要求将表达式中的表达式if计算为一个值,因此,除非常量为,否则将以两种方式放置都会产生编译错误论点。(如果是布尔值,则==无论如何都不应该使用…)

  • 问题内容: [object Object]是JavaScript Object的默认字符串表示形式。 我会知道这是正义还是正义,但是为什么呢?为什么第一个单词是小写而第二个单词是大写?它是JSON还是JavaScript的一部分? 问题答案: 所有对象都有一个以格式显示内容的方法,其中type是对象类型。 当您在get上调用该对象时,并且在一个对象上调用该字符串时,您会得到该字符串,因为它基于Ob

  • keys_.keys(object) 检索object拥有的所有可枚举属性的名称。 _.keys({one: 1, two: 2, three: 3}); => ["one", "two", "three"] allKeys_.allKeys(object) 检索object拥有的和继承的所有属性的名称。 function Stooge(name) { this.name = name

  • 描述 (Description) java.lang.reflect.Method.invoke(Object obj, Object... args)方法在具有指定参数的指定对象上调用此Method对象表示的基础方法。 各个参数自动展开以匹配原始形式参数,并且原始参数和参考参数都根据需要进行方法调用转换。 声明 (Declaration) 以下是java.lang.reflect.Method.

  • 除了通过putObject接口上传文件到OSS以外,OSS还提供了另外一种上传模式 —— Multipart Upload。用户可以在如下的应用场景内(但不仅限于此),使用Multipart Upload上传模式,如: 需要支持断点上传。 上传超过100MB大小的文件。 网络条件较差,和OSS的服务器之间的链接经常断开。 需要流式地上传文件。 上传文件之前,无法确定上传文件的大小。 下面我们将一步