java - 使用lambda表达式(匿名内部类)传参是否有性能问题?
阿神
阿神 2017-04-18 10:53:20
0
3
1143

编程有一条原则如下:

避免创建不必要的对象:最好能重用对象,而不要在每次需要的时候就创建一个相同功能的新对象。

请看如下代码:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

 // 1、匿名内部类
Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});

//2、lambda表达式
Collections.sort(names, (a, b) -> b.compareTo(a));

是不是每次排序都创建了一个新的Comparator对象,导致性能降低?那么还主张使用Lambda表达式吗

阿神
阿神

闭关修行中......

모든 응답(3)
Peter_Zhu

먼저 질문에 대답하세요.
정렬할 때마다 새로운 Comparator 객체가 생성되어 성능이 저하되나요? 그렇다면 여전히 람다 표현식 사용을 옹호하시나요?
아니요, 저는 옹호합니다

  1. 근본적인 이유
    Lamdba는 익명 내부 클래스에 대한 구문 설탕이 전혀 아니라는 의미이며, 이는 Lambda 표현식의 기본 구현이 익명 내부 클래스의 구현이 아니라는 의미입니다. 사실 두 가지

  2. 어떻게 증명하나요?
    익명 내부 클래스는 실제로 컴파일 중에 ClassName$ 숫자 형식으로 이름이 지정된 클래스 파일을 생성하므로 Lamdba 표현식의 맨 아래 레이어도 익명 내부 클래스에 의해 구현되는 경우 유사하게 유사한 내부 파일이 생성됩니다.
    따라서 서로 다른 패키지의 클래스에 예제를 작성한 다음 컴파일된 효과를 확인합니다.
    익명의 내부 클래스가 InnerTest를 구현합니다


    클래스 파일인데 2개나 있는 걸 볼 수 있어요

    람다 표현식 LamdbaTest

    그런데 클래스 파일은 하나뿐입니다


    그러니 진실은 하나뿐이군요 ㅎㅎ 당연히 이건 전혀 같지 않습니다

  3. Lambba 표현식은 어떻게 구현되나요?
    바이트코드를 살펴보면 근본적인 차이점이 완전히 드러납니다.
    InnerTest

    LamdbaTest

    두 가지가 사용하는 명령어가 다르다는 것을 알 수 있는데, Lamdba 표현식을 파싱할 때 Java 7의 새로운 Invokedynamic 명령어를 사용한다는 점을 잘 알고 계시다면 바로 이해하실 수 있을 것입니다. 이에 익숙하다면 Du Niang에게
    라고 물어보면 됩니다. 하지만 이 명령의 이름을 보면 바로 알 수 있습니다. 동적 호출
    따라서 실제로는 익명 내부 클래스와 달리 class 파일, Lamdba 표현식은 -p를 보면 다시 볼 수 있습니다. 생성된 메소드의 이름은 lambda$main

    입니다.

으아아아
  • 꽤 좋아해요.

    阿神
    1. 각 정렬은 새로운 Comparator 객체를 생성하지 않습니다. 일반적으로 Lambda 표현식에 해당하는 인스턴스가 메모리에 생성되면 JVM은 아래에서 재사용됩니다. 구체적인 지침은 다음 링크를 참조하세요: 람다 표현식의 런타임 평가

    2. 프로그램 가독성과 개발 효율성을 높일 수 있다는 전제하에 Lambda 표현식

    3. 을 사용하는 것이 좋습니다.
    刘奇
    1. Lambda 표현식 내에서 익명 클래스 객체를 정적으로 선언할 수 있습니다.

    2. 왔다 갔다하는 작은 객체는 JVM에 큰 문제가 되지 않습니다.

    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿