怎样利用lambda表达式写出简洁,高逼格的代码

lambda表达式

定义

关于lambda表达式,你需要知道以下几点

1,虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能
2,Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口,他只能在jdk8以后才能使用
3,基本语法:
(parameters) -> expression

(parameters) ->{ statements; }


关于lambda表达式的定义,就不再赘述了,直接开始使用,那么我们在哪些场景中会用到呢

遍历集合

以前我们遍历一个集合或者数组,我们是怎么做的呢

  • 你可能是这样的
 		String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
 		List<String> starList = Arrays.asList(stars);
        for (int i = 0; i < starList .length; i++) {
            System.out.println(starList.get(i));
        }
  • 也有可能是这样的
        String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
        List<String> starList = Arrays.asList(stars);
        for (String star : starList ) {
            System.out.println(star);
        }
  • 但是利用lambda表达式,你可以这样
	// 使用 lambda 表达式以及函数操作(functional operation) 
        String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
        List<String> starList = Arrays.asList(stars);
        starList.forEach((star)-> System.out.println(star));
  • 当然,你还可以这样
	//双冒号操作符(double colon operator)  
    String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
        List<String> starList = Arrays.asList(stars);
        starList.forEach(System.out::println);
在使用匿名内部类的时候

你以前创建线程是怎么做的呢
继承Thread类?一般不会吧
实现Runnable接口?
实现callable接口?
很多时候调用子线程并不需要确切的名字,大多是用匿名内部类


  • 那么你创建线程可能是这样的
        new Thread(new Runnable(){
            @Override
            public void run() {
                System.out.println(1);
            }
        }).start();
  • 但是利用lamda表达式.你可以这样
new Thread(()-> System.out.println(1)).start();
集合排序

有没有试过对集合排序
还是举上面的例子

  • 以前你可能这样对集合排序
        String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
        Arrays.sort(stars, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return (s1.compareTo(s2));
            }
        });
  • 利用lambda表达式你可以这样
        String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
        Arrays.sort(stars,(String s1,String s2)->(s1.compareTo(s2)));
  • 当然你也可以根据首字母进行排序
        //根据名字的首字母排序
        Arrays.sort(stars,(String s1,String s2)->(s1.charAt(0)-s2.charAt(0)));

其他的排序也是类似,大家可以自行测试

stream和lamda的结合使用
  • 我们先来创建一个实体类
/**
 * @Description 球员
 * @Author apdoer
 * @Date 2019/4/19 15:02
 * @Version 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor  //关于这三个注解,如果不了解lombok插件的也可以手写构造方法,getter/setter等,往期文章也讲到过
public class Player {
    private String name;
    private String team;
    private Integer age;
    private Integer score;
}
  • 如果有一个集合我们想把其中的某个属性提取出来,比如下面这样
        List<Player>list = new ArrayList<>();
        list.add(new Player("kobe","lakers",31,30000));
        list.add(new Player("james","lakers",34,33000));
        list.add(new Player("paul","rocket",34,20000));
        list.add(new Player("hardon","rocket",31,20000));

        List<String> names = new ArrayList<>();
        for (Player player : list) {
            names.add(player.getName());
        }
        for (String name : names) {
            System.out.println(name);
        }
  • 但是利用lambda表达式,你可以这样
        List<Player>list = new ArrayList<>();
        list.add(new Player("kobe","lakers",31,30000));
        list.add(new Player("james","lakers",34,33000));
        list.add(new Player("paul","rocket",34,20000));
        list.add(new Player("hardon","rocket",31,20000));
		//这样
        List<String> names = list.stream().map(Player::getName).collect(Collectors.toList());
        names.forEach(System.out::println);
  • 当然我们还可以更复杂一点的操作,给每个球员的分数加1000
   		list.forEach( s -> s.setScore(s.getScore() + 1000));
        list.stream().map(Player::getScore).collect(Collectors.toList()).forEach(System.out::println);
  • 我们也可以过滤出分数大于30000年龄小于32的球员
        list.stream()
                .filter((p)->(p.getScore()>30000))
                .filter((p)->(p.getAge()<32))
                .collect(Collectors.toList())
                .forEach(System.out::println);
  • 当然也可以使用.limit(int i)来限制收集的个数,这就是api的使用了,大家自行尝试
  • 排序呢,当然也是可以的,我们可以根据球员的分数来排序
        list.stream()
                .sorted((p1,p2)->(p1.getScore()-p2.getScore()))
                .collect(Collectors.toList())
                .forEach(System.out::println);
  • 关于上面的用法,有以下几点

具体的各种方法大家可以去试,也可查询文档,方法级别的就不再赘述了
集合流化后可以收集成list,也可以收集成set,具体看需求
流化处理将是spring6的一大特性,大家可以关注
今天就写到这里,其他的想起来再写

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值