Jef*_*Sze 14 java java-8 java-stream
该Stream.reduce方法以a BinaryOperator为参数.a的函数签名BinaryOperator是(T,T) -> T.该BigDecimal::min方法在其方法签名中只有1个参数(即.(T) -> T).
当我传递BigDecimal::min给Stream.reduce方法时,为什么编译器不会抱怨?
示例代码:
List<BigDecimal> bigDecimalList = new ArrayList<>();
bigDecimalList.add(BigDecimal.valueOf(1));
bigDecimalList.add(BigDecimal.valueOf(2));
bigDecimalList.add(BigDecimal.valueOf(3));
BigDecimal minResult = bigDecimalList.stream().reduce(BigDecimal::min).orElse(BigDecimal.ZERO);
Run Code Online (Sandbox Code Playgroud)
谢谢.
Eug*_*ene 19
实际上,这称为对特定类型的任意对象的实例方法的引用.
编译器将调用实例作为第一个参数,因此它们是等效的:
BinaryOperator<BigDecimal> b = (left, right) -> left.min(right);
BinaryOperator<BigDecimal> b2 = BigDecimal::min;
b2.apply(left, right);
Run Code Online (Sandbox Code Playgroud)
当你有这样的事情时,事情会很有趣IMO:
@FunctionalInterface
interface TriFunction<A, B, C, R> {
R apply(A a, B b, C c);
}
Run Code Online (Sandbox Code Playgroud)
理论课:
class Test {
int x;
int y;
public Test(int x, int y) {
this.x = x;
this.y = y;
}
public Test copy(int n, int m) {
return new Test(m, n);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样写:
TriFunction<Test, Integer, Integer, Test> f = Test::copy;
TriFunction<Test, Integer, Integer, Test> f2 =
(test, i, j) -> test.copy(i, j);
Run Code Online (Sandbox Code Playgroud)
因为BigDecimal::min是一个实例方法.(T, T) -> T如果你使用的话,Javac很聪明,可以把它变成一个BigDecimal::min.传递给结果的第一个参数BinaryOperator将是实例,第二个参数将是参数min(尽管在BinaryOperator这种情况下需要订单可以反转).(T) -> T如果你使用类似的东西将是new BigInteger(1)::min.
| 归档时间: |
|
| 查看次数: |
910 次 |
| 最近记录: |