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

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。Java基础(9)——从匿名内部类 到 函数式编程Lamda表达式 & List的函数式编程案例,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

引出

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


在这里插入图片描述

什么是匿名内部类

没有类名—-匿名内部类

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

在这里插入图片描述

在这里插入图片描述

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的函数式编程,案例;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/165156.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!