给定以下示例类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));
}
有人能帮我掌握正确的语法吗?
您似乎混淆了函数类型参数的顺序。要编写“接受一个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
,或者只是使用,它也适用于字符串。
问题内容: 我有一列包含数字。是否可以在带有功能的服务器端以逗号显示数字?还是我需要在客户端使用php脚本?我更喜欢服务器端。 提前致谢。 问题答案: 只需使用MySQL的功能 或PHP的
我用Swift 2.2编写了以下代码,但当切换到Swift 3.0时,如果条件“二进制运算符”不能应用于“AnyObject”和“String”类型的操作数,则会出现错误 请建议解决方案,如上面if let语句中的代码所示,如果字典值返回nil,则我为特定键指定了空白字符串(“”)
任何帮助都会很好。
我有一个正则表达式来从完整命令中提取脚本名。它适用于大多数情况,但不适用于示例数据中的第一行。 抽样资料 输出应该是 正则表达式不适用于第一行 https://regex101.com/r/cFjn85/1
我有个简单的课 我创建了这个类的样本对象的ArrayList 这里没有显示我后来如何填充对象的其他字段(名称,地址等) 有没有一种方法可以使用字母数字字符串id快速检索其中一个对象,而无需遍历整个列表?(没有实现数据库层) 差不多