> Java > java지도 시간 > 본문

Java 예제의 람다 표현식에 대한 자세한 설명

WBOY
풀어 주다: 2022-04-24 12:04:48
앞으로
2142명이 탐색했습니다.

이 기사에서는 람다 표현식과 관련된 문제를 주로 소개하는 java에 대한 관련 지식을 제공합니다. 람다 표현식은 Java 언어에서 **"->"** 연산자를 소개합니다. 이 연산자를 람다 연산자 또는 화살표 연산자라고 합니다. , 함께 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다

Java 예제의 람다 표현식에 대한 자세한 설명

추천 학습: "java 비디오 튜토리얼"

1. Lambda에 대한 첫 소개

우리는 Java에서 인터페이스는 인스턴스화할 수 없지만 인터페이스 객체는 구현 클래스 객체를 가리킬 수 있습니다. 인터페이스에 구현 개체가 없으면 어떻게 되나요? 다음과 같이 익명 클래스를 사용할 수도 있습니다.

public class JavaTest {
    public static void main(String[] args) {
        Fly fly = new Fly() {
            @Override
            public void fly(String name) {
                System.out.println(name + "飞行");
            }
        };
        fly.fly("张三");
    }}interface Fly{
    abstract void fly(String name);}
로그인 후 복사

하지만 익명 내부 메서드를 사용하면 실제로 코드의 양이 그리 간결하지 않습니다. 이러한 기능을 보다 간단한 구문으로 구현하기 위해 람다 표현식을 사용하여 단순화된 코드는 다음과 같습니다.

public class JavaTest {
    public static void main(String[] args) {
        Fly fly = name -> System.out.println(name + "飞行");
        fly.fly("张三");
    }}interface Fly{
    abstract void fly(String name);}
로그인 후 복사
람다 표현식을 통해서도 동일한 효과를 얻을 수 있지만 코드 양이 매우 간결하다는 점이 람다 표현식의 매력입니다.

2. 기능적 인터페이스

람다 표현식의 구문을 배우기 전에 먼저

기능적 인터페이스

가 무엇인지 알아야 합니다. 한 가지 메소드만 구현하는 인터페이스를 기능적 인터페이스라고 합니다.

//接口中只有一个待实现的方法 fly,所以这是函数式接口interface Fly{
     void fly(String name);}//接口中有两个待实现的方法 这是不是函数式接口interface Run{
    void fastRun();
    void slowRun();}//接口中有两个方法,但其中一个是已经定义好的default方法,真正需要子类去实现的方法只有一个 这是函数式接口interface Jump{
    void jump();
    default void highJump(){
        System.out.println("跳的更高");
    }}
로그인 후 복사
인터페이스에 **@FunctionalInterface

주석을 추가하여 인터페이스가 기능적 인터페이스임을 확인할 수 있습니다. 인터페이스가 기능적 인터페이스가 아닌 경우 컴파일 시 오류가 발생합니다.


왜 기능적 인터페이스가 무엇인지 알아야 합니까? Lambda 표현식은 인터페이스의 익명 클래스 구현을 단순화하므로 기능적 인터페이스**에서만 작동합니다. Java 예제의 람다 표현식에 대한 자세한 설명 이는 이해하기 쉽습니다. 인터페이스에 구현할 메서드가 여러 개 있는 경우 Lambda 표현식은 현재 인터페이스에서 어떤 메서드를 구현하고 있는지 알 수 없습니다.

3. 람다 표현식 구문

람다 표현식은 Java 언어에 람다 연산자 또는 화살표 연산자라고 하는 **"->"** 연산자를 도입합니다. 람다를 두 부분으로 나눕니다.

왼쪽: 람다 표현식에 필요한 모든 매개변수를 지정합니다.

오른쪽: 람다 본문, 즉 람다 표현식에서 수행할 함수를 구성합니다.

이렇게:

(parameters) -> expression
或
(parameters) ->{ statements; }
로그인 후 복사

-> 및 람다 본문 외에도 매개변수 유형 및 메서드 본문 코드 줄 번호에 따라 매개변수, 괄호, 대괄호 등 람다 표현식의 다른 매개변수가 생략될 수 있습니다.
다음 기능 인터페이스 구현을 예로 들어 보겠습니다.
interface MathOperation {
        int operation(int a, int b);
    }

    interface GreetingService {
        void sayMessage(String message);
    }

    private int operate(int a, int b, MathOperation mathOperation){
        return mathOperation.operation(a, b);
    }
    
    interface NoParam{
        int returnOne();
    }
로그인 후 복사

다음은 람다 표현식의 중요한 기능입니다.

선택적 유형 선언
    : 람다 표현식은 구현 메서드의 매개변수 유형을 선언할 필요가 없습니다. 컴파일러는 이를 매개변수 값으로 균일하게 식별할 수 있습니다.
  •         // 类型声明
            MathOperation addition = (int a, int b) -> a + b;
            // 不用类型声明
            MathOperation subtraction = (a, b) -> a - b;
    로그인 후 복사
선택적 매개변수 괄호
    : 매개변수는 괄호로 정의할 필요가 없지만, 매개변수가 없거나 여러 매개변수를 괄호로 정의할 필요는 없습니다.
  •       // 不用括号
            GreetingService greetService1 = message ->
                    System.out.println("Hello " + message);
    
            // 用括号
            GreetingService greetService2 = (message) ->
                    System.out.println("Hello " + message);
    로그인 후 복사
선택적 중괄호
    : 본문에 명령문이 포함되어 있으면 중괄호를 사용할 필요가 없습니다.
  •      // 多条语句不可以省略大括号
            MathOperation multiplication = (int a, int b) -> {
                int num = a+1;
                num = a + b;
                return a * b + num;
            };
    
            // 单条语句可以省略大括号
            MathOperation pision = (int a, int b) -> a / b;
    로그인 후 복사
선택적 반환 키워드
    : 본문에 표현식 반환 값이 하나만 있는 경우 컴파일러는 자동으로 값을 반환합니다. 중괄호는 표현식이 값을 반환하도록 지정해야 합니다.
  •   // 多条语句的Lambda表达式如果有返回值,需要使用return
            MathOperation multiplication = (int a, int b) -> {
                int num = a+1;
                num = a + b;
                return a * b + num;
            };
    
            // 单条语句可以省略return
            MathOperation pision = (int a, int b) -> a / b;
    로그인 후 복사
    4. Lambda 표현식의 사용 범위
Lambda 표현식은 익명 클래스 생성을 단순화하는 데만 사용되는 것이 아니라 더 많은 용도로 사용됩니다.

1. 변수에 값 할당

위에서 람다 표현식은 변수에 값을 할당하는 것입니다. 이는 익명 내부 클래스 할당의 코드 세그먼트를 단순화하고 읽기 효율성을 향상시킬 수 있습니다.

MathOperation subtraction = (a, b) -> a - b;
로그인 후 복사

2. 반환 결과

interface MathOperation {
        int operation(int a, int b);
    }

    MathOperation getOperation(int a, int b){
        return (a1, b1) -> a+b;
    }
로그인 후 복사
3. 배열 요소로

MathOperation math[] = {
                (a,b) -> a+b,
                (a,b) -> a-b,
                (a,b) -> a*b        };
로그인 후 복사

4. 일반 메소드 또는 생성자 메소드의 매개변수로

public static void main(String args[]){

        Java8Tester java8Tester = new Java8Tester();
        java8Tester.operate(1,2,((a, b) -> a*b));

    }

    private int operate(int a, int b, MathOperation mathOperation){
        return mathOperation.operation(a, b);
    }

    interface MathOperation {
        int operation(int a, int b);
    }
로그인 후 복사

5. 람다 표현식의 표현식 본문에서 표현식 외부의 변수에 액세스할 수 있지만 다른 변수는 수정할 수 없습니다.

6. 람다 표현식의 참조 작성 방법


람다를 배우다 보면 다음과 같은 이상한 작성 방법을 발견할 수도 있습니다. Java 예제의 람다 표현식에 대한 자세한 설명

// 方法引用写法GreetingService greetingService = System.out::println;
        greetingService.sayMessage("hello world");
로그인 후 복사
한 번도 본 적 없는 기호가 여기에 나타납니다: : , this 작성 방식을 메소드 참조라고 합니다.

분명히 메소드 참조를 사용하는 것은 일반 람다 표현식보다 간단합니다.

메서드를 호출하여

기능적 인터페이스 구현이 달성된 경우

메서드 참조를 사용할 수 있습니다.

public class Java8Tester {


    public static void main(String args[]){

        // 静态方法引用--通过类名调用
        GreetingService greetingService = Test::MyNameStatic;
        greetingService.sayMessage("hello");
        Test t = new Test();
        //实例方法引用--通过实例调用
        GreetingService greetingService2 = t::myName;
        // 构造方法方法引用--无参数
        Supplier<test> supplier = Test::new;
        System.out.println(supplier.get());
    }



    interface GreetingService {
        void sayMessage(String message);
    }}class Test {
    // 静态方法
    public static void MyNameStatic(String name) {
        System.out.println(name);
    }

    // 实例方法
    public void myName(String name) {
        System.out.println(name);
    }

    // 无参构造方法
    public Test() {
    }}</test>
로그인 후 복사

7、Lambda表达式的优缺点

优点:

  • 更少的代码行-lambda表达式的最大好处之一就是减少了代码量。我们知道,lambda表达式只能与功能接口一起使用。例如,Runnable 是一个接口,因此我们可以轻松地应用lambda表达式。

  • 通过将行为作为方法中的参数传递来支持顺序和并行执行-通过在Java 8中使用Stream API,将函数传递给collection方法。现在,集合的职责是以顺序或并行的方式处理元素。

  • 更高的效率-过使用Stream API和lambda表达式,可以在批量操作集合的情况下获得更高的效率(并行执行)。 此外,lambda表达式有助于实现集合的内部迭代,而不是外部迭代。

缺点

  • 运行效率-若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势)
  • 很难调试-Lambda表达式很难打断点,对调式不友好。
  • 不容易看懂-若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂(我学Lambda表达式的原因是看不懂同事写的Lambda表达式代码)

推荐学习:《java视频教程

위 내용은 Java 예제의 람다 표현식에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿