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

方法声明,其中包含用于提取对象字段的函数和将应用于这些字段的二进制运算符

张玺
2023-03-14

给定以下示例类Foo

@Getter
@AllArgsConstructor
@ToString
static class Foo {
    int field1;
    int field2;
    String field3;
}

我想声明一个方法,我们将其称为ApplyByOperator,它接受两个对象,一个键提取器和一个二进制运算符,并将该运算符应用于Foo对象的提取字段并返回结果。因此,基本上我想用以下方式或类似方式调用该方法:

Foo foo1      = new Foo(10, 20, "first");
Foo foo2      = new Foo(100, 200, "second");

int sum       = applyBinOperator(foo1, foo2, Foo::getField1, (a,b) -> a+b);

int prod      = applyBinOperator(foo1, foo2, Foo::getField2, (a,b) -> a*b);

String concat = applyBinOperator(foo1, foo2, Foo::getField3, (a,b) -> String.join(a,b));

//and get sum = 110, prod = 4000 and concat = firstsecond 

但我很难找到正确的语法来定义这个方法,因为我对泛型不太熟悉。我尝试了以下方法,但尚未编译:

public  static <T> T applyBinOperator(Foo foo1, Foo foo2, 
       Function<? super T, ?> keyExtractor, BinaryOperator<T> binaryOperator) {

    return binaryOperator.apply(keyExtractor.apply(foo1), keyExtractor.apply(foo2));
}

有人能帮我掌握正确的语法吗?

共有1个答案

姚凯歌
2023-03-14

您似乎混淆了函数类型参数的顺序。要编写“接受一个Foo并返回一个T的函数”,这就是函数

public  static <T> T applyBinOperator(Foo foo1, Foo foo2,
                                      Function<Foo, T> keyExtractor, BinaryOperator<T> binaryOperator) {
    return binaryOperator.apply(keyExtractor.apply(foo1), keyExtractor.apply(foo2));
}

我们也可以使Foo部分通用,并应用PECS:

public  static <T, U> T applyBinOperator(U foo1, U foo2,
                                      Function<? super U, ? extends T> keyExtractor, BinaryOperator<T> binaryOperator) {
    return binaryOperator.apply(keyExtractor.apply(foo1), keyExtractor.apply(foo2));
}

此外,String.join不会将"first""第二"连接在一起。您可能是指String.concat,或者只是使用,它也适用于字符串。

 类似资料: