2017-01-13 6 views
1

В моей Java 8 код,Java Lambda выражение ошибки

public ChangePersonsName(String email, final String password, final String wantedUsername, final String uuid, final long time, int latency, int[] requests, int[] proxyRequests) throws IOException { 
    final AtomicReference<Object> token = new AtomicReference<Object>(); 
    final AtomicReference<ArrayList<?>> newHeaders = new AtomicReference<ArrayList<?>>(); 
    new Thread(() -> { 
     boolean lock = true; 
     while (lock) { 
      if (time - System.currentTimeMillis() > 60000) continue; 
      Map<Header[], String> loginResults = null; 
      try { 
       loginResults = this.login(email, password, uuid); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
      String token = loginResults.entrySet().iterator().next().getValue(); 
      Header[] headers = loginResults.entrySet().iterator().next().getKey(); 
      newHeaders.set(new ArrayList<Object>()); 
      for (Header header : headers) { 
       if (!header.toString().startsWith("Set-Cookie:")) continue; 
       ((List<BasicHeader>)newHeaders.get()).add(new BasicHeader("Cookie", header.toString().split("Set-Cookie: ")[1])); 
      } 
      lock = false; 
     } 
    } 
    ).start(); 
    new Timer().schedule(new TimerTask(){ 

Вы заметите, что

String token = loginResults.entrySet().iterator().next().getValue(); 

вызывает ошибку компиляции,

локальная переменная лексема

Lambda Экспрессия может не переобъявить другая локальная переменная, определенная в охватывающей области.

Мой вопрос: как можно было бы это исправить? Я довольно новичок в Java, я, наверное, должен знать, как это исправить, но я этого не делаю.

+0

'окончательный AtomicReference маркер = новый AtomicReference ();' У вас есть две переменные с тем же именем ('token'). Это сказано в сообщении _local variable ** токен ** не может переопределить другую локальную переменную, определенную в охватывающей области ._ – AxelH

+2

* «Как бы это исправить?» * Назовите это чем-то другим. – Andreas

+1

Возможный дубликат [variable уже определен в методе lambda] (http://stackoverflow.com/questions/22773003/variable-is-already-defined-in-method-lambda) – AxelH

ответ

4

У вас уже есть переменная с именем token в этой области. Вы объявили его во 2-й строке. Чтобы исправить просто переименовать 2-ю переменную:

String newToken = loginResults.entrySet().iterator().next().getValue();