Java基础(9)——从匿名内部类 到 函数式编程Lamda表达式 & List的函数式编程案例

文章介绍了Java中从匿名内部类到Lambda表达式的进化,展示了如何使用Lambda简化代码,特别是在List的函数式编程中,包括排序、过滤、映射、去重等操作。此外,还给出了计算价格、平均价格和品牌统计等实际案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引出

从匿名内部类到函数式编程的进化


在这里插入图片描述

什么是匿名内部类

没有类名----匿名内部类

在这里插入图片描述没有类名----匿名内部类

在这里插入图片描述

在这里插入图片描述

List的匿名内部类

@FunctionalInterface 注解在这里插入图片描述
在这里插入图片描述

Collections.sort(list, new Comparator<Emp>() {
    @Override
    public int compare(Emp o1, Emp o2) {
        return (int) (o1.getAge()-o2.getAge());
    }
 });

o1和o2是啥:

在这里插入图片描述

Returns:
a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.

进一步的简化:

Collections.sort(list,(o1, o2)->{
    return (int) (o1.getAge()-o2.getAge());
});

函数式编程–lamda表达式

从完整的实现类 到 匿名内部类 到函数式编程

完整的实现类:

public class EatImpl implements IEat {
    @Override
    public void eat() {
        System.out.println("吃快餐");
    }
}

匿名内部类

IEat e = new IEat() {
    @Override
    public void eat() {
        System.out.println("吃面条...");
    }
};
e.eat();

lamda表达式:

在这里插入图片描述接口:@ FunctionalInterface

​ 只有一个唯一的方法需要实现

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);   //需要实现类实现
    boolean equals(Object obj);
    default Comparator<T> reversed() {
        return Collections.reverseOrder(this);
    }
}

在这里插入图片描述

List的函数式编程

@FunctionalInterface

出现在接口,此接口可以使用Lamda表达式。
在这里插入图片描述
List.stream()

在这里插入图片描述

创建一个lsit

List<Car> list = new ArrayList<>();
list.add(new Car(1, "BMW", "黑色", 350000.00, 1789.0));
list.add(new Car(2, "QQ", "橙色", 50000.00, 589.0));
list.add(new Car(3, "Benz", "白色", 450000.00, 1889.0));
list.add(new Car(4, "BYD", "绿色", 1080000.00, 2989.0));
list.add(new Car(5, "Audi", "红色", 880000.00, 1489.0));

需求:查询价格低于500000.00的车

1.普通方法:循环

for(Car c :list){
if(c.getPrice()<500000.00){
    System.out.println(c);
}
}

2.用lamda改写
要素:流对象,过滤条件,收集结果

list = list.stream() //流对象,函数编程
        .filter(car->car.getPrice()<500000.00) //过滤条件
        .collect(Collectors.toList()); //收集结果

多个条件的例子:

list.stream()
        .filter(car->car.getBrand().equals("BMW") && car.getStore()<10)
                .collect(Collectors.toList());

排序

list =  list.stream()
        .sorted((o1, o2) -> o1.getId()-o2.getId())
        .collect(Collectors.toList());

limit:限制数量

需求:找出价格最低5种车。

list= list.stream()
.sorted((o1, o2) -> (int) (o1.getPrice() - o2.getPrice()))
.limit(5)
.collect(Collectors.toList());

最大/小

需求找出库存最多的?

Car c = list.stream()
        .max((o1, o2) -> o1.getStore()-o2.getStore())
                .get()  ;
System.out.println(c);

计算价格和、平均价格

  • 计算price之和
  • 计算price*store之和
System.out.println(list.stream()
       .mapToDouble(car -> car.getPrice())
        .sum());
System.out.println(list.stream()
      .mapToDouble(car -> car.getPrice() *car.getStore())
       .sum());
  • 计算price的平均价格
  • 计算总量的平均价格
System.out.println(list.stream()
        .mapToDouble(car -> car.getPrice() *car.getStore())
        .average().getAsDouble());

去重,映射

统计出系统有哪些品牌的车?

List<String> brands = list.stream()
        .map(Car::getBrand)  //映射
        .distinct()   //去重
        .collect(Collectors.toList());
System.out.println(brands);

更多集合的lamda案例

Java基础(2)——列表 & 集合List,函数式编程Lamda表达式

总结

1.匿名内部类是啥;
2.函数编程是啥;
3.从匿名内部类到函数式编程;
4.list的函数式编程,案例;

### Java Lambda 表达式概述 Lambda 表达式Java 8 引入以来,显著简化了代码的书写方式,在集合操作和流处理(Stream API)等方面尤为突出[^1]。作为一种简洁表示匿名方法的方式,Lambda 表达式允许开发者以更加紧凑的形式实现具有单个抽象方法的接口&mdash;&mdash;即所谓的函数式接口[^2]。 ### 基本语法结构 基本形式如下所示: ```java (parameters) -&gt; expression // 或者 (parameters) -&gt; { statements; } ``` 这里 `(parameters)` 是输入参数列表;`-&gt;` 称作箭头运算符,用于分隔参数部分与主体部分;而 `expression` 则代表执行逻辑或返回值计算的部分。如果主体包含多条语句,则需要用大括号包裹起来并显式指定返回值。 #### 函数式接口的应用实例 由于 Lambda 只能用来替代拥有唯一抽象成员声明的接口,因此这些特定类型的接口被命名为&ldquo;函数式接口&rdquo;。下面给出几个常见的例子来展示其实际用途: - **Comparator 接口** 比较器是一个典型的函数式接口案例之一,通常用于对象数组排序或其他需要定义顺序关系的地方。通过使用 Lambda 来代替传统内部类写法可以极大减少冗余度。 ```java List&lt;String&gt; names = Arrays.asList(&quot;Alice&quot;, &quot;Bob&quot;, &quot;Charlie&quot;); Collections.sort(names, (a, b) -&gt; a.compareTo(b)); System.out.println(names); ``` 这段代码实现了字符串列表按字母序升序排列的功能。 - **Runnable 接口** 另一个典型应用场景是在并发编程领域内创建线程任务时采用无名类模式。借助于 lambda 的优势同样能够达到相同效果的同时让源码更为直观易读。 ```java new Thread(() -&gt; { System.out.println(&quot;Thread is running...&quot;); }).start(); ``` 此片段展示了启动新线程打印消息的过程。 ### 集合框架中的运用 除了上述提到的基础功能外,lambda 还特别适用于增强版迭代器以及 Stream 流API的操作上。比如过滤、映射转换等复杂流程都可以利用链式调用完成高效的数据加工过程。 考虑这样一个需求:给定一组整数找出其中所有的偶数值并将它们平方后存入新的容器里去。按照常规做法可能涉及多重循环嵌套加上条件判断才能达成目标,但有了 stream 和 lambda 就变得异常简单明了了: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args){ List&lt;Integer&gt; numbers = Arrays.asList(1, 2, 3, 4, 5); List&lt;Integer&gt; result = numbers.stream() .filter(n -&gt; n % 2 == 0) .map(n -&gt; n * n) .collect(Collectors.toList()); System.out.println(result); // 输出 [4, 16] } } ``` 在这个程序段落中,`.stream()` 方法开启了一个管道起点,后续跟随的一系列中间操作如 `.filter()`, `.map()` 对原始数据进行了筛选和平方变换,最后由终端动作 `.collect()` 收集成果形成最终的结果集。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arya's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值