Scala 如何用java实现函数式的akka actor
我用java实现了简单的计数器:Scala 如何用java实现函数式的akka actor,scala,functional-programming,akka,reactive-programming,Scala,Functional Programming,Akka,Reactive Programming,我用java实现了简单的计数器: public class CounterJavaActor extends UntypedActor { int count = 0; @Override public void onReceive(Object message) throws Exception { if (message.equals("incr")) { count += 1; } else if (mes
public class CounterJavaActor extends UntypedActor {
int count = 0;
@Override
public void onReceive(Object message) throws Exception {
if (message.equals("incr")) {
count += 1;
} else if (message.equals("get")) {
sender().tell(count, self());
}
}
}
在coursera“scala中的函数反应式编程”课程中,我看到计数器的函数实现:
/**
* Advantages:
* state change is explicit
* state is scoped to current behaviour
*/
class CounterScala extends Actor{
def counter(n: Int) : Receive = {
case "incr" => context.become(counter(n+1))
case "get" => sender ! n
}
def receive = counter(0)
}
Upd:
我的问题是,在java中,我不能像scala计数器(n+1)
那样进行函数调用。这意味着什么:
public class CounterJava8Actor extends AbstractActor {
//counter(0) in scala
private PartialFunction<Object, BoxedUnit> counter;
private int n = 0;
public CounterJava8Actor() {
counter =
ReceiveBuilder.
matchEquals("get", s -> {
sender().tell(n, self());
}).
matchEquals("inc", s -> {
//become(counter(n+1) in scala
context().become(counter);
}).build();
receive(counter);
}
}
公共类CounterJava8Actor扩展了AbstractActor{
//scala中的计数器(0)
专用部分功能计数器;
私有整数n=0;
公共计数器java8actor(){
柜台=
接收生成器。
matchEquals(“获取”,s->{
发送者()。告诉(n,self());
}).
matchEquals(“公司”,s->{
//在scala中变为(计数器(n+1)
context().been(计数器);
}).build();
接收(柜台);
}
}
根据您可以在java 8中使用的been/unbecome文档,可以用java以函数式方式实现它 下面是从那里复制的示例代码
public class HotSwapActor extends AbstractActor {
private PartialFunction<Object, BoxedUnit> angry;
private PartialFunction<Object, BoxedUnit> happy;
public HotSwapActor() {
angry =
ReceiveBuilder.
matchEquals("foo", s -> {
sender().tell("I am already angry?", self());
}).
matchEquals("bar", s -> {
context().become(happy);
}).build();
happy = ReceiveBuilder.
matchEquals("bar", s -> {
sender().tell("I am already happy :-)", self());
}).
matchEquals("foo", s -> {
context().become(angry);
}).build();
receive(ReceiveBuilder.
matchEquals("foo", s -> {
context().become(angry);
}).
matchEquals("bar", s -> {
context().become(happy);
}).build()
);
}
}
根据文档,您可以在Java8中使用Been/unbecome 下面是从那里复制的示例代码
public class HotSwapActor extends AbstractActor {
private PartialFunction<Object, BoxedUnit> angry;
private PartialFunction<Object, BoxedUnit> happy;
public HotSwapActor() {
angry =
ReceiveBuilder.
matchEquals("foo", s -> {
sender().tell("I am already angry?", self());
}).
matchEquals("bar", s -> {
context().become(happy);
}).build();
happy = ReceiveBuilder.
matchEquals("bar", s -> {
sender().tell("I am already happy :-)", self());
}).
matchEquals("foo", s -> {
context().become(angry);
}).build();
receive(ReceiveBuilder.
matchEquals("foo", s -> {
context().become(angry);
}).
matchEquals("bar", s -> {
context().become(happy);
}).build()
);
}
}
我的问题-PartialFunction上类似scala的函数调用。我提出了我的问题这很简单,但scala语法让我感到尴尬:(我的问题-PartialFunction上类似scala的函数调用。我提出了我的问题这很简单,但scala语法让我感到尴尬:(
private PartialFunction<Object, BoxedUnit> counter(final int n) {
return ReceiveBuilder.
matchEquals("get", s -> {
sender().tell(n, self());
}).
matchEquals("inc", s -> {
context().become(counter(n + 1));
}).build();
}
public CounterJava8Actor() {
receive(counter(0));
}