什么时候要用到Lambda写法(匿名内部类简洁写法,含有创建线程,遍历集合,遍历数组)

答:因为接口不能创建对象,当你new一个接口时,且接口只有一个抽象方法,你可以采用匿名内部类的普通写法,也可以使用lambda写法简写匿名内部类,也就是采用匿名内部类方式创建接口里的抽象方法的匿名(只用一次,没有变量存储)实现类对象;

参考匿名内部类的普通写法和Lambda写法区别

参考创建线程

说明:红色的是可以省略的,蓝色时省略省略下来的,并且如果蓝色区域内的传参括号内参数只有一个,直接写参数变量即可

补充:不仅仅是抽象方法,还有抽象类也可以使用

参考集合遍历和数组遍历

说明:里面有些方法需要建立在jdk8版本的基础上

package com.jt.project;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;

public class LambdaTests {
    public static void main(String[] args) {

        /**集合遍历写法*/
        List<String> list = Arrays.asList("A", "B", "C");
        /**遍历集合 */
        /*匿名内部类基本写法*/
        System.out.print("匿名内部类基本写法");
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.print(s);
            }
        });
        System.out.println("----------------");
        /*匿名内部类简洁写法,也就是使用lambda写法,
        可以省略省略new接口,省略重写注解,省略抽象方法,省略参数类型
        只需要括号(参数)加箭头->加重写抽象方法的方法体{方法体}*/
        System.out.print("匿名内部类简洁写法");
        list.forEach((s)-> {
                System.out.print(s);
            });
        System.out.println("----------------");
        /*匿名内部类超简洁写法,需要建立在jdk8版本的基础上
        * 参数和小括号都可以省了,并且
        * System.out.print(s)换成System.out::print*/
        System.out.print("匿名内部类超简洁写法");
        list.forEach(
            System.out::print
        );
        System.out.println("----------------");


        /**数组遍历写法1,难度低*/
        String strArray[]={"abc","ab","a"};
        /*数组遍历基本写法*/
        Arrays.asList(strArray).forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        /*数组遍历简洁写法*/
        Arrays.asList(strArray).forEach((s)-> {
                System.out.println(s);
        });
        /*数组遍历超简洁写法*/
        Arrays.asList(strArray).forEach(System.out::println);

        /**数组遍历写法2,难度稍大*/
        /*数组遍历基本写法*/
        Arrays.sort(strArray, new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                        return o1.length() - o2.length();
                    }
                });
        Arrays.asList(strArray).forEach(System.out::println);

        /*遍历数组简洁写法*/
        Arrays.sort(strArray, (o1, o2) -> {
                    return o1.length() - o2.length();
                });

        Arrays.asList(strArray)
                .forEach(System.out::println);

        /*遍历数组超级简洁写法*/
        Arrays.sort(strArray);

        Arrays.asList(strArray)
                .forEach(System.out::println);
    }

}

<think>好的,用户想知道如何用Lambda表达式简化代码,我得先回忆一下Lambda的基本概念和用法。Lambda表达式在Java中主要是用来替代匿名内部类,特别是在函数式接口的情况下。记得函数式接口就是只有一个抽象方法的接口,比如Runnable、Comparator这些。 用户提到了示例,可能需要具体的代码对比,展示Lambda如何简化。比如,之前用匿名类的地方,现在用Lambda会更简洁。例如,线程创建,之前是new Runnable(),现在可以用() -> {}的形式。或者比较常见的Comparator排序,匿名内部类可以简化成Lambda表达式。 根据引用[2]里的内容,参数类型可以省略,如果只有一个参数,括号也可以省略。方法体只有一行的话,可以省略大括号和分号,如果是return语句,连return也要省略。比如Arrays.sort(arr, (o1, o2) -> o2 - o1); 这样就从原来的匿名类简化成了一行代码。 另外,Lambda还可以和Stream API结合使用,比如集合遍历、过滤、映射等操作。比如用forEach替换传统的for循环,代码会更简洁。例如list.forEach(System.out::println); 这样的方法引用也是Lambda的一种简化形式。 可能需要分步骤讲解,先讲Lambda的基本语法,然后举几个常见的例子,比如线程、排序、事件处理等,对比传统写法Lambda写法。还要提到Lambda表达式适用的函数式接口,以及如何结合Stream API进行更复杂的操作。 还要注意用户可能对Lambda的作用和优势不太清楚,需要解释为什么Lambda能简化代码,比如减少模板代码,提高可读性等。同时,需要指出Lambda的局限性,比如只能用于函数式接口,复杂的逻辑可能还是需要传统方法。 另外,引用[1]里提到Lambda可以和流操作组合使用,比如过滤、映射、排序,所以在示例中可以展示一个完整的流处理流程,用Lambda简化后的代码是什么样的。例如,从集合中过滤出偶数,然后排序,再转换成平方数,最后收集成列表,这样的链式调用配合Lambda会很简洁。 用户可能需要实际的代码示例来理解,所以准备几个不同场景的例子会比较有帮助。比如事件监听器、线程集合排序、遍历、Stream操作等。每个例子都展示传统写法Lambda写法,并说明简化的规则。 还要注意可能出现的常见错误,比如在Lambda中修改外部变量的问题,或者Lambda表达式中的异常处理,这些可能需要额外说明,但用户的问题主要是简化代码,所以可能不需要深入这些细节,除非用户问到。 总结一下,回答的结构应该是先介绍Lambda的作用,然后分点说明简化规则,每个规则配合示例代码,接着展示不同场景的应用,最后提到结合Stream API的优势。同时引用提供的资料,特别是参数省略、大括号省略等规则,确保回答准确并符合引用内容。</think>### 如何使用Lambda表达式简化代码? Lambda表达式是Java 8引入的语法特性,主要用于简化函数式接口(仅含一个抽象方法的接口)的匿名实现。以下是具体简化方法和示例: --- ### 一、Lambda表达式简化规则 根据引用[2]的规则,Lambda表达式可通过以下方式简化代码: 1. **省略参数类型** Java编译器可自动推断参数类型,无需显式声明。 ```java // 原写法 (String s) -> System.out.println(s); // 简化后 s -> System.out.println(s); ``` 2. **单参数省略括号** 若只有一个参数,可省略参数括号。 ```java // 原写法 (x) -> x * x; // 简化后 x -> x * x; ``` 3. **单行代码省略大括号和分号** 若方法体仅一行代码,可省略大括号和分号。 ```java // 原写法 (a, b) -> { return a + b; }; // 简化后 (a, b) -> a + b; ``` 4. **省略return关键字** 若方法体是return语句,需同时省略return和分号。 ```java // 原写法 (o1, o2) -> { return o2 - o1; }; // 简化后 (o1, o2) -> o2 - o1; ``` --- ### 二、常见应用场景示例 #### 1. 简化`Comparator`接口(排序) ```java // 传统匿名类写法 Arrays.sort(arr, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; // 降序 } }); // Lambda简化写法 Arrays.sort(arr, (o1, o2) -> o2 - o1); // 引用[2] ``` #### 2. 简化`Runnable`接口(线程) ```java // 传统写法 new Thread(new Runnable() { @Override public void run() { System.out.println("Thread running"); } }).start(); // Lambda简化写法 new Thread(() -> System.out.println("Thread running")).start(); ``` #### 3. 简化集合遍历(`forEach`) ```java List<String> list = Arrays.asList("a", "b", "c"); // 传统增强for循环 for (String s : list) { System.out.println(s); } // Lambda + forEach简化 list.forEach(s -> System.out.println(s)); // 进一步使用方法引用 list.forEach(System.out::println); // 引用[1] ``` #### 4. 结合Stream API(过滤与映射) ```java List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); // 传统方式筛选偶数并平方 List<Integer> result = new ArrayList<>(); for (Integer num : numbers) { if (num % 2 == 0) { result.add(num * num); } } // Stream + Lambda简化 List<Integer> result = numbers.stream() .filter(n -> n % 2 == 0) .map(n -> n * n) .collect(Collectors.toList()); // 引用[1] ``` --- ### 三、Lambda表达式的优势 - **减少冗余代码**:无需编写匿名类的模板代码。 - **提高可读性**:逻辑更聚焦于核心操作。 - **组合操作灵活**:可与Stream API结合,实现链式处理(如过滤、映射、排序)[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值