Scala 如何用java实现函数式的akka actor

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

我用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 (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));
}