関数の章で説明したように、元々Scalaにもラムダ式に相当する無名関数という構文があります。しかし、以前のScalaではFunctionN型が期待される箇所に限定されており、Javaにおいてラムダ式が期待される箇所の大半において使用することができませんでした。例えば、10の階乗の例はIntBinaryOperator型が期待されているので以下のように無名クラスを使う必要がありました。
scala> import java.util.stream.IntStream;
import java.util.stream.IntStream
scala> import java.util.function.IntBinaryOperator;
import java.util.function.IntBinaryOperator
scala> val factorial10 = IntStream.rangeClosed(1, 10).reduce(1,
| new IntBinaryOperator {
| def applyAsInt(left: Int, right: Int) = left * right;
| });
factorial10: Int = 3628800
SAM変換を利用すると以下のようにここにも無名関数を利用できるようになります。
scala> import java.util.stream.IntStream;
import java.util.stream.IntStream
scala> val factorial10 = IntStream.rangeClosed(1, 10).reduce(1, _ * _);
factorial10: Int = 3628800