Java8- "effectively final"

标签 java lambda java-8 rx-java

我正在使用 RxVertx,它是一种 RxJava 和 Java8,但我遇到了编译错误。

这是我的代码:

public rx.Observable<Game> findGame(long templateId, GameModelType game_model, GameStateType state) {

return context.findGame(templateId, state)
    .flatMap(new Func1<RxMessage<byte[]>, rx.Observable<Game>>() {

        @Override
        public Observable<Game> call(RxMessage<byte[]> gameRawReply) {

            Game game = null;

            switch(game_model) {

                case SINGLE: {

                    ebs.subscribe(new Action1<RxMessage<byte[]>>() {

                        @Override
                        public void call(RxMessage<byte[]> t1) {

                            if(!singleGame.contains(0) {
                                game = new Game();       // ERROR is at this line
                                singleGames.put(0, game);
                            } else {
                              game = singleGames.get(0); // ERROR is at this line
                            }
                        }
                    });
                }
            }

            return rx.Observable.from(game);
        }
    });
}

编译错误是: “在封闭范围内定义的局部变量游戏必须是最终的或实际上是最终的”

我无法将“游戏”定义为 final,因为我进行了分配\设置并在函数末尾返回它。

我怎样才能编译这段代码??

谢谢。

最佳答案

我有一个 Holder 类,可用于此类情况。

/**
 * Make a final one of these to hold non-final things in.
 *
 * @param <T>
 */
public class Holder<T> {
  private T held = null;

  public Holder() {
  }

  public Holder(T it) {
    held = it;
  }

  public void hold(T it) {
    held = it;
  }

  public T held() {
    return held;
  }

  public boolean isEmpty() {
    return held == null;
  }

  @Override
  public String toString() {
    return String.valueOf(held);
  }

}

然后您可以执行以下操作:

final Holder<Game> theGame = new Holder<>();
...

theGame.hold(myGame);
...
{
  // Access the game through the `final Holder`
  theGame.held() ....

关于Java8- "effectively final",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26163645/

相关文章:

java - Groovy 在 Java 可选上同时运行 map 和 orElseGet

c++ - Lambda 捕获 constexpr 对象

java - 使用Streams为列表的每个元素调用方法

java - 简单的java程序出错

C++11 lambda 表达式

datetime - 未找到 PowerMockito 和 Java 8 ZonedDateTime toInstant()

java - maven不使用64位jvm

java - libgdx 非连续渲染

java - 不使用全局变量读取线程的当前状态

java - 如何停止通过实现可运行接口(interface)创建的线程?