Java Lambda 표현식의 화살표 이해 요약

Java Lambda 표현식의 화살표 이해 요약

다음은 람다식인데 헷갈리시면 여기서 배우시면 됩니다.

//示例1:lambda表达式排序
String[] players = {"11", "22", "99", "88", "55"}; 
Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));

//示例2:系统源码中的一段示例:
Executor mExecutor = XXX;
mExecutor.execute(() -> mSoftApListener.onConnectedClientsChanged());

//示例3:系统源码中的一段示例:
IWifiIface iface = XXX;
iface.getName((WifiStatus status, String name) -> {
                if (status.code == WifiStatusCode.SUCCESS) {
                    nameResp.value = name;
                } else {
                    Log.e(TAG, "Error on getName: " + statusString(status));
                }
            });

위의 코드에서 볼 수 있듯이 람다 식은 메서드 매개 변수에 큰 코드 문자열을 작성하는 것입니다.

이전에 람다를 본 적이 있지만 가끔 시스템 소스 코드의 메서드가 약간 혼란스러워서 요약해야 할 때가 있습니다.

일반적으로 코드를 작성할 때 람다식을 사용하지 않는데, 코드가 간결하긴 하지만 좀 추상적인 느낌이 듭니다.
그리고 람다 표현식을 작성하려면 구현 메소드에 콜백 매개변수가 몇 개인지, 반환 값이 필요한지 여부 등 매개변수 객체에 대해 잘 알고 있어야 합니다.
모든 메서드를 람다 식으로 작성할 수 있는 것은 아니며,
필요한 조건은 메서드의 매개변수에 객체가 있고 객체가 새로운 경우 내부 메서드를 구현해야 한다는 것입니다.

Lambda 식의 간단한 이해는 새로운 프로세스와 콜백 메서드를 생략하는 것입니다.

람다식 화살표 -> 이해하기:
화살표의 앞부분은 콜백 메소드의 매개변수이고,
화살표의 뒷부분은 콜백 메소드가 반환해야 하는 값 또는 수행해야 하는 작업입니다.

1. 간단한 Lambda의 기본 지식 포인트:

1. 无参数,返回值为 5 
() -> 5  
方法参数对象的实现方法无回调参数,并且需要返回一个int值。


2. 接收一个参数(数字类型),返回其2倍的值 
x -> 2 * x 
方法参数对象的实现方法有一个回调参数,并且需要返回回调参数的两倍。

3. 接受2个参数(数字),并返回他们的差值 
(x, y) -> x – y 
方法参数对象的实现方法有两个回调参数,并且需要返回回调参数的x-y。

// 4. 接收2个int型整数,返回他们的和 
(int x, int y) -> x + y
方法参数对象的实现方法有两个回调int(可省略)参数,并且需要返回回调参数的x-y。
比如示例1 的代码。就是基于这个知识点。

 // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void) 
(String s) -> System.out.print(s)
方法参数对象的实现方法有一个回调String(可省略)参数,无需返回值,可执行其他操作比如加个打印。
实现方法无返回值时,可以使用{}并且在里面执行多条语句,比如示例3 的代码,就是基于这个知识点。


이상은 람다식에 대한 기본지식으로 이해하지 못하셔도 상관없으며 아래 예제를 통해 이러한 지식 포인트를 이해할 수 있습니다.

실제로 매개변수 객체의 콜백 메소드에 매개변수가 있는지 여부와 콜백 메소드에 반환값이 있는지 여부의 네 가지 경우가 있습니다.
화살표 앞부분은 매개변수 객체의 콜백 메소드에 있는 매개변수용이고 화살표 뒷부분은 콜백 메소드의 반환 값용입니다.

2. 람다식의 예

1. 구현 방법에는 매개 변수가 없고 반환 값이 없습니다.

일반 스레드 스레드는 비교를 작성하는 람다 식을 실행합니다.


    //普通的Java表达式:
    new Thread(new Runnable() {
            @Override
            public void run() {
                Log.i("TAG", "test Thread");
            }
        }).start();

        //Lambda表达式,打印一个日志
        new Thread(()->Log.i("TAG", "test Thread")).start();

여기에서 Lambda 표현식이 매개 변수 객체의 익명 클래스 생성과 그 안에 있는 콜백 메서드를 생략한 것을 볼 수 있습니다.

이 방법으로 코드를 보는 것은 훨씬
더 간단합니다; 사실,
우리 호출자는 읽을 때 익명 클래스와 콜백 메서드를 알 필요가
없고 는 콜백이며 그 안에서 무언가를 해야 합니다.

2. 구현 방법에 매개 변수가 있고 반환 값이 없습니다.

Android 컨트롤 클릭 이벤트 Lambda 표현식 쓰기 비교:


        TextView textView = new TextView(this);
        //普通的Java表达式:
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.i("TAG", "test");
            }
        });

        //Lambda表达式,打印一个日志
        textView.setOnClickListener((View view) -> Log.i("TAG", "test")); //这里也可以用{}执行多个命令
        
        //Lambda表达式,执行多行命令
        textView.setOnClickListener(view -> {
            Log.i("TAG", "test");
            Log.i("TAG", "test2");
        });

여기서 매개변수는 매개변수 이름을 직접 정의하거나 매개변수 유형을 추가할 수 있다는 점은 주목할 가치가 있습니다.
View view ->... 와 view ->... 는 같은 의미로
파라미터가 여러 개일 경우 파라미터 타입을 추가하면 쉽게 구분할 수 있습니다.

3. 구현 방법에는 매개 변수와 반환 값이 있습니다.

배열 데이터를 작은 것부터 큰 것까지 정렬합니다.


       
        List<String> players = {"11", "22", "99", "88", "55"}; 

        // 1.1 使用匿名内部类根据 name 排序 players 
        Comparator<String> comparatorName = new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return (s1.compareTo(s2));
            }
        };
        Arrays.sort(players, comparatorName);


        // 1.2 使用 lambda expression 排序 players 
        comparatorName = (String s1, String s2) -> (s1.compareTo(s2));

        //如果需要执行多个语句并且需要返回值,可以用{}并在里面进行return。
        comparatorName = (String s1, String s2) -> {
            Log.i("TAG", "test compareTo");
            return s1.compareTo(s2);
        };

        Arrays.sort(players, comparatorName);



        // 1.3 也可以采用如下形式: 
        Arrays.sort(players, (s1, s2) -> (s1.compareTo(s2)));
        
        // 1.4 也可以采用如下形式:
        Arrays.sort(players, String::compareTo);//这个特殊写法记忆一下就行

여기서 다중 파라미터 모니터링은 앞의 ()로 작성해야 함을 알 수 있으며, 파라미터가 타입을 선언하지 않은 경우 화살표 앞에 ()를 사용할 수 없습니다.

위 코드 예제를 학습한 후 천천히 숙고해보면 기본 람다 표현의 ->는 난독증이 없습니다.

마지막으로 Lambda 화살표에 대한 이해를 요약해 보겠습니다.


1、Lambda表达式必定有方法的参数是一个对象的情况,并且new这个对象有必须实现的方法。

2、Lambda表达式就是省略了参数对象中的匿名类的创建和里面的回调方法名,方法参数类型也可以省略;

3、Lambda表达式箭头->前面是回调方法的参数,箭头->后面是回调需要返回的值或者需要是回调方法需要执行的代码;

4、方法参数对象回调方法,如果回调方法没有参数就用()写在箭头->前面
如果回调方法的参数有一个或者多个就在()里面,参数类型可写可不写;
需要注意的是要么全部不要参数类型,要么全部带参数类型,否则会报错;


5、方法参数对象回调方法,如果直接返回一个值或者执行一条代码写在箭头->后面即可
如果回调方法中需要执多行代码,可以把代码写在{}里面。


위는 이 Lambda의 일반적인 사용법을 요약한 것입니다.
위의 요약을 자세히 살펴보면 메서드에 화살표가 여러 개 있어도 혼동하지 않을 것입니다 -> 천천히 그 관계를 분석하십시오.실제 상황에서는 메서드의 매개 변수에 매개 변수 개체
있고
파라미터 객체의 콜백 메소드에 의해 실행되는 코드에 람다식이 있거나
파라미터가 여러 개 있어 단계별 분석에 문제가 없습니다.

그러나 단순히 외워야 할 특별한 경우도 있습니다.

다른

1. 람다식으로 리스트 데이터 출력

String[] atp = {"Rafael Nadal", "Novak Djokovic", "Stanislas Wawrinka"};  
List<String> players = Arrays.asList(atp); 

// 以前的循环方式 
for (String player : players) {  
     System.out.print(player + "; ");  
} 

// 使用 lambda 表达式以及函数操作(functional operation) 
players.forEach((player) -> System.out.print(player + "; "));

 // 在 Java 8 中使用双冒号操作符(double colon operator) 
players.forEach(System.out::println);

시스템은 안드로이드에서 기본적으로 사용하지 않기 때문에 쓸모가 없습니다.

2. Lambda 표현식이 값을 반환할 필요가 없지만 코드가 값을 직접 반환하는 경우(예: ->5) 어떻게 됩니까?


这个是会编译报错,就是不允许这样写,
要么你写成->{} //执行空操作
要么你写成->method() //执行一个方法,不管这个方法有没有返回值都可以正常编译

상호 격려: 아직 더 잘 사용할 수 있는 시간이 많이 있습니다.

추천

출처blog.csdn.net/wenzhi20102321/article/details/124657126