这是一个简单的课程,说明了我的问题:
package com.example;
import java.util.function.*;
public class App {
public static void main(String[] args) {
App a1 = new App();
BiFunction<App, Long, Long> f1 = App::m1;
BiFunction<App, Long, Void> f2 = App::m2;
f1.apply(a1, 6L);
f2.apply(a1, 6L);
}
private long m1(long x) {
return x;
}
private void m2(long x) {
}
}
f1
,引用App::m1
,并且a1
调用f1
时绑定到apply
,效果非常好 - 编译器很开心并且可以通过f1.apply进行调用。
f2
,指的是App::m2
,不起作用。
我希望能够定义一个没有返回类型的未绑定非静态方法的方法引用,但我似乎无法使它工作。
答案 0 :(得分:11)
<div class="image-circle">
<div>
<img class="img" src="https://cdn.pbrd.co/images/GNK97WG.png">
</div>
</div>
.image-circle {
width:25%;
}
.image-circle:after {
content: "";
background: #4679BD;
padding-bottom: 100%;
border-radius: 50%;
display: block;
width: 100%;
height:0;
-moz-border-radius: 50%;
-webkit-border-radius: 50%;
}
.image-circle div {
float:left;
width:100%;
line-height:1em;
margin-top:-0.5em;
padding-top:40%;
text-align:center;
}
表示接受两个参数的函数 nd生成结果。
我希望能够定义对未绑定的方法引用 非返回类型的非静态方法
使用BiFunction
代替一个接受两个输入参数并且不返回结果的操作。
BiConsumer
然后改变这个:
BiConsumer<App, Long> f2 = App::m2;
到此:
f2.apply(a1, 6L);
答案 1 :(得分:3)
方法参考是App :: m2,就像你一样,但它不能分配给BiFunction,因为它不会返回一个值,即使是一个Void值(必须是{ {1}})。你必须这样做:
null
如果你想要一个BiFunction。或者,您可以使用其他答案中提到的BiConsumer。