java - 无法解析符号 'v' 和预期的 ) 和 ;

标签 java android lambda

请帮助解决此错误。我似乎无法理解。

我在这部分有错误。

 signup.setOnClickListener((v) → {
        String uName = username.getText().toString().trim();
        String mail = email.getText().toString().trim();
        String pass = password.getText().toString().trim();

        signup(uName, mail, pass);

        });

完整代码:

public class SignUp extends AppCompatActivity {
    private String TAG = SignUp.class.getSimpleName();
    private EditText username, email, password;
    private Button signup;
    private ProgressDialog progressDialog;
    private UserSession session;
    private UserInfo userInfo;
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_up);

        username = (EditText) findViewById(R.id.username);
        email = (EditText) findViewById(R.id.email);
        password = (EditText) findViewById(R.id.password);
        signup = (Button) findViewById(R.id.signup);
        progressDialog = new ProgressDialog(this);

        GoogleApiClient client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();

        session = new UserSession(this);
        userInfo = new UserInfo(this);


        signup.setOnClickListener((v) → {
        String uName = username.getText().toString().trim();
        String mail = email.getText().toString().trim();
        String pass = password.getText().toString().trim();

        signup(uName, mail, pass);

        });

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client2 = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    }

    private void signup(final String username, final String email, final String password) {
        //Tag used to cancel the request
        String tag_string_req = "req_signup";
        progressDialog.setMessage("Signing up...");
        progressDialog.show();

        StringRequest strReq = new StringRequest(Request.Method.POST,
                Utils.REGISTER_URL, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                Log.d(TAG, "Register Response: " + response.toString());

                try {
                    JSONObject jOBj = new JSONObject(response);
                    boolean error = jOBj.getBoolean("error");

                    //Check for error node in json
                    if (!error) {
                        JSONObject user = jOBj.getJSONObject("user");
                        String uName = user.getString("username");
                        String email = user.getString("email");

                        //Inserting row in users table
                        userInfo.setEmail(email);
                        userInfo.setUsername(uName);
                        session.setLoggedin(true);

                        startActivity(new Intent(SignUp.this, MainActivity.class));

                    } else {
                        //Error in login. Get the error message
                        String errorMsg = jOBj.getString("error_msg");
                        toast(errorMsg);
                    }
                } catch (JSONException e) {
                    //JSON error
                    e.printStackTrace();
                    toast("Json error: " + e.getMessage());
                }

            }


        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "Login Error: " + error.getMessage());
                toast("Unknown Error occured");
                progressDialog.hide();
            }
        }) {

            @Override
            protected Map<String, String> getParams() {
                //posting parameters to login url
                Map<String, String> params = new HashMap<>();
                params.put("username", username);
                params.put("email", email);
                params.put("password", password);

                return params;
            }

        };
    }

    private void toast(String x) {
        Toast.makeText(this, x, Toast.LENGTH_SHORT)
    }


    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    public Action getIndexApiAction() {
        Thing object = new Thing.Builder()
                .setName("SignUp Page") // TODO: Define a title for the content shown.
                // TODO: Make sure this auto-generated URL is correct.
                .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
                .build();
        return new Action.Builder(Action.TYPE_VIEW)
                .setObject(object)
                .setActionStatus(Action.STATUS_TYPE_COMPLETED)
                .build();
    }

    @Override
    public void onStart() {
        super.onStart();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client2.connect();
        AppIndex.AppIndexApi.start(client2, getIndexApiAction());
    }

    @Override
    public void onStop() {
        super.onStop();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        AppIndex.AppIndexApi.end(client2, getIndexApiAction());
        client2.disconnect();
    }
}

请解释发生了什么。

最佳答案

lambda 语法使用 ->,而不是 。你从哪里得到这个? (编辑:似乎这是 IntelliJ 的代码缩短。您是从 IntelliJ 复制的吗?)

如果你想使用 lambda,请使用它。

signup.setOnClickListener(v -> {
    String uName = username.getText().toString().trim();
    String mail = email.getText().toString().trim();
    String pass = password.getText().toString().trim();
    signup(uName, mail, pass);
});

这仅适用于 Java 8(在 Gradle 文件等中设置您的版本) 请参阅Use Java 8 Language Features .

编辑:Java 7 及更低版本不支持 lambda。如果您想使用 Java < 8,请使用完整接口(interface)和匿名内部类:

signup.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String uName = username.getText().toString().trim();
        String mail = email.getText().toString().trim();
        String pass = password.getText().toString().trim();
        signup(uName, mail, pass);
    }
});

编辑:为什么使用getText().toString()getText 不会返回一个 String 吗?您可以在代码中删除对 toString 的这些调用。

关于java - 无法解析符号 'v' 和预期的 ) 和 ;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41801833/

相关文章:

java - 将用户输入字符串中的数据添加到数组

java - Maven 管理的 Java EE 应用程序中 JBoss 提供的库

c++ - lambda 捕获列表中的 weak_ptr、shared_ptr 和 std::queue<T,Container>::emplace

.net - 为什么从表达式动态生成的委托(delegate)比硬编码的 lambda 慢?

java - SymmetricDS 新方言

Java ResourceBundles 变音搞砸了

java - Google SignInButton 上的致命异常

安卓:设置初始保存状态

android - 带有 ActionBarDrawerToggle 的 ActionBarActivity - 不使用 drawerImageRes

c# - Linq 如何在所有值都等于 null 或 0 时获取平均值? MVC