Java 8::(双冒号)运算符的Scala等价物
我需要处理来自Scala的Java8流。Scala中Java8的等价物是什么Java 8::(双冒号)运算符的Scala等价物,java,scala,Java,Scala,我需要处理来自Scala的Java8流。Scala中Java8的等价物是什么 // Java IntStream.range(1, 4) .forEach(System.out::println); // Scala IntStream.range(1, 4) .forEach() // <- ??? //Java IntStream.range(1,4) .forEach(System.out::println); //斯卡拉 IntStream.range(1,4) .fo
// Java
IntStream.range(1, 4)
.forEach(System.out::println);
// Scala
IntStream.range(1, 4)
.forEach() // <- ???
//Java
IntStream.range(1,4)
.forEach(System.out::println);
//斯卡拉
IntStream.range(1,4)
.forEach()/这非常简单:
scala> (1 to 4).foreach(println)
1
2
3
4
在Scala中,在不提供参数的情况下引用方法,例如:
def fn(arg: SomeType)
(collection_of_some_type).foreach(fn)
脱去糖衣
(collection_of_some_type).foreach(fn(_))
这反过来又转化为:
(collection_of_some_type).foreach(next_entry => fn(next_entry))
scala中方法引用的等效值如下:
IntStream.range(1, 4)
.forEach(System.out.println _)
编译或运行REPL时,可以使用-xeexperimental
,以访问将Scala函数转换为所需Java SAM的实验功能:
IntStream.range(1, 4).forEach(System.out.println(_))
谢谢,但我需要做的是处理Java流API,而不是实现同样的功能question@Shouichi所以你应该更具体地说明你想要实现什么。在Java中,必须使用特殊运算符作为变量访问函数。在Scala中,不需要特殊运算符。例如,System.out::println
将是java.lang.System.out.println
,仅此而已。谢谢。虽然这可能是我想要的,但我得到了错误:扩展函数缺少参数类型((x$1)=>System.out.println(x$1))
。有什么想法吗?@Shouichi使用2.11.4 REPL为我工作,如上所述。我想这确实是一个实验性的特征!也许可以尝试使用不同的语法变体(例如x=>f(x)
,f
,f(
)和f
)。最坏的情况就是实现IntConsumer
接口。看起来确实如此!我不想在生产系统中使用实验性功能并实现Java的流接口。这不起作用,因为它不满足类型系统。