lambda表达式学习笔记

目录

1.匿名内部类

2.lambda表达式

2.1没被其他的方法调用实现方法

2.2被其他方法调用了实现方法

3.创建Stream流

4.中间操作

4.1filter 筛选

4.2Map 投影

4.3distinct 去重

4.4sorted 排序

4.5limit 

4.6skip


1.匿名内部类

说明:不关注继承/实现的类/接口的子类,只关注与传递的参数和重写/实现的方法

实现的接口:

public interface Hello {
    abstract void hello();
}

 创建的内部类:

new Hello() {
            @Override
            public void hello() {
                System.out.println("你好我是匿名内部类");
            }
        };

2.lambda表达式

2.1没被其他的方法调用实现方法

匿名内部类写法:

new Hello() {
            @Override
            public void hello() {
                System.out.println("你好我是匿名内部类");
            }
        }.hello();//.hello()是调用这个实现方法

lambda表达式:

((Hello) () -> System.out.println("你好我是匿名内部类")).hello();//没被其他方法调用时,必须指定类名

2.2被其他方法调用了实现方法

function接口:

调用的方法:

 public static  <R>R typeC (Function<String,R> function){
        String str="123";
        R apply = function.apply(str);
        return apply;

    }

匿名内部类写法:

Integer c = typeC(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return Integer.valueOf(s);
            }
        });//被其他方法调用时,只需写参数和重写的方法

lambda表达式:

 Integer c = typeC(s -> Integer.valueOf(s));//被其他方法调用时,只需写参数和重写的方法
String s1 = typeC(s -> s + "sang");

3.创建Stream流

 注:entrySet把Map集合转换成Set集合

4.中间操作

准备工作:创建一个LIst<User>集合并赋值

  List<User> users = new ArrayList<>();
        User user1= new User("libai", 1001);
        User user2 = new User("lisi", 1002);
        users.add(user1);
        users.add(user2);

4.1filter 筛选

内部类形式:


        users.stream().filter(new Predicate<User>() {
            @Override
            public boolean test(User user) {
                return user.getId()>1001;
            }
        }).forEach(
                new Consumer<User>() {
                    @Override
                    public void accept(User user) {
                        System.out.println(user.getId());
                    }
                }
        );

lambda:


       users.stream().filter(user -> user.getId()>1001).forEach(
                user -> System.out.println(user.getId())
        );

注:filter参数为一个泛型,返回值为Boolean,即可以做判断并返回为true的流

4.2Map 投影

users.stream().map(new Function<User, String>() {
            @Override
            public String apply(User user) {
                return user.getName();
            }
        }).map(new Function<String, String>() {
            @Override
            public String apply(String name) {
                return name + "附加";
            }
        }).forEach(name-> System.out.println(name));
users.stream().map(user -> user.getName()).map(name->name+"附加").forEach(name-> System.out.println(name));

注:参数类型为:参数为一个泛型,返回值也是一个泛型,第一个Map跟SQL里的投影类似,第二个则可以对取到的投影值进行操作。

投影后,后续传递的参数就是投影的name。

4.3distinct 去重

注:distinct依赖equals方法,不重写就会调用Object的equals方法,但是Object的只能比对地址值,但是实际生产时,我们要比对地址or属性

users.stream().distinct().forEach(user -> System.out.println(user));

4.4sorted 排序

users.stream().distinct().sorted(new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o2.getId() - o1.getId();
            }
        }).forEach(user -> System.out.println(user.getId()));
 users.stream().distinct().sorted((o1, o2) -> o2.getId()-o1.getId()).forEach(user -> System.out.println(user.getId()));

注:排序不能由重复的元素,所以提前去重

使用空参构造方法bean类要实现Comparator接口

传递的参数是两个一样的泛型,返回值是下面两种形式:

o2.getId()-o1.getId():降序

o1.getId()-o2.getId():升序

4.5limit 

        users.stream().distinct().sorted((o1, o2) -> o2.getId() - o1.getId()).limit(1).forEach(user -> System.out.println(user.getId()));

注:跟SQL的limit类似

4.6skip

 users.stream().distinct().sorted((o1, o2) -> o2.getId() - o1.getId()).skip(1).forEach(user -> System.out.println(user.getId()));

注:跟limit相反,取第n位之后的流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lambda表达式是Python语言的一个特殊功能。它可以作为一种简便的写法,对于那些需要频繁使用函数,但又觉得定义函数过程过于麻烦和浪费时间的程序员来说,可以节省很多写代码的时间,并且提高程序的效率。lambda表达式也可以用于编写Python中的回调函数,可以使以前过程冗长的回调函数更加可读、简洁、明了。这些优点使得lambda表达式成为一个非常有用的、必须了解和学习的编程工具。 lambda表达式可以看做是一种简化版函数,并且比函数还要简单明了一些。lambda表达式通常作为快速编写处理小型数据集的函数的一种工具使用。通常将lambda表达式保存在变量中,这样就可以像常规函数一样调用它了。举一个例子,比如我要对一个列表中的数字进行平方操作: numbers = [1, 2, 3, 4, 5] squared_numbers = list(map(lambda x: x ** 2, numbers)) 可以看到,上面这个例子中使用了一个lambda表达式来定义一个简单的平方函数,并通过map函数应用到列表中的每个元素上。 了解了lambda表达式之后,我们还需要学习它的一些注意事项和规则。首先,lambda表达式只能有一个表达式,不能包含语句和注释。其次,lambda表达式的参数是可选的,但如果没有参数,那么必须在表达式的前面加上空的小括号。最后,lambda表达式一般用于一个简短的函数中,不应该定义复杂的函数。 综上所述,了解和学习lambda表达式是一项非常有用的技能,可以极大地提高编写Python代码的效率和准确性。尤其是在处理小型数据集时,使用lambda表达式可以节省很多时间和精力。但同样重要的是,我们需要注意lambda表达式的使用规则和注意事项,以确保程序的正确性和可读性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值