現在のスコープでメソッドを参照したい場合は、クラス名 (静的メソッドの場合) または
演算子のthis
前に指定する必要があります。::
たとえば、次のように書く必要があります。
import java.util.stream.Stream;
public class StreamTest {
public static int trimmedLength(String s) {
return s.trim().length();
}
public static void main(String[] args) {
System.out.println(Stream.of(" aaa ", " bb ", " c ")
.mapToInt(StreamTest::trimmedLength).sum());
}
}
ではそれほど大きな問題ではありませんthis
が、クラス名が非常に長くなる可能性があるため、静的メソッドが過密に見えることがあります。::trimmedLength
コンパイラが代わりに単純に書くことを許可してくれたらいいのに:
public static void main(String[] args) {
System.out.println(Stream.of(" aaa ", " bb ", " c ")
.mapToInt(::trimmedLength).sum());
}
ただし、Java-8 コンパイラはこれを許可しません。私にとっては、クラス/オブジェクト名が通常のメソッド呼び出しと同じ方法で解決されていれば、かなり一貫しているように思えます。これは、特定の場合に役立つメソッド参照の静的インポートもサポートします。
問題は、なぜそのような構文または類似の構文が Java 8 で実装されなかったのかということです。そのような構文で発生する問題はありますか? それとも、まったく考慮されていませんでしたか?