JAVA 8 lambda 表达式保姆级教程

话不多说,现在开始。
点击目录,跳转浏览。

1. 使用实例

1.1 - 简单使用

  1. 初始化数据
() -> 5

从上面我们可以总结出,当lambda 表达式的写法,写成下方样式的时候

() -> 5

相当于传入一个方法,方法默认返回值为5,具体的写法也可以写成

() -> {
	return 5;
}

等价于

public int method(){
	return 5;
}

1.2 - 使用:: 操作符

java8 中新增的一种关键字,我们可以通过 :: 关键字来访问类的构造方法,对象方法,静态方法等。
在使用lambda 的过程中,比如以下情况

(str) -> System.out.println(str);

可以精简为

System.out::println

此时代码可以自动将前面流操作所返回的数据,进行对该方法参数的填充,从而让代码更好的理解,可以更多的关注于业务层面。

相同的使用方法还有:

String::new // 可以创建出一个String 对象

(如有更多例子可以下面留言,我来添加到文章中)

1.3 - 使用@FunctionalInterface 注解

(暂未开坑)

2. 使用Stream

初始化数据

   List<Long> sourceList = new LinkedList<>();
   sourceList.add(1L);
   sourceList.add(2L);
   sourceList.add(3L);
   sourceList.add(4L);
   sourceList.add(5L);
   Map<String, Integer> sourceMap = = new LinkedHashMap<>();
   sourceMap.put("a1", 1);
   sourceMap.put("a2", 2);
   sourceMap.put("a3", 3);
   sourceMap.put("a4", 4);
   sourceMap.put("a5", 5);

2.1 - sorted

可以使用sorted 方法进行排序,参数上可以传入一个Comparator 对象来进行处理排序规则,具体的排序顺序,可以看具体教程。(默认为字典排序,既从小到大排序)

简单来讲Comparator 方法的实现,在于o1o2的比较结果。
如果o1o2 小,则返回小于0 的返回值。
如果o1 大于o2,则返回大于0 的返回值。
如果相同,则返回0

   List<Long> result = sourceList.stream().sorted(new Comparator<Long>() {
   		@Override
   		public int compare(Long o1, Long o2) {
               return o1.compareTo(o2);
   		}
   });

此方法也可以精简为

 List<Long> result = sourceList.stream().sorted((o1, o2) -> o1.compareTo(o2)); 

还可以进一步精简为

 List<Long> result = sourceList.stream().sorted(Long::compareTo);

2.2 - filter

 List<Long> result = sourceList
                    .stream()
                    .filter(e -> e > 3)
                    .collect(Collectors.toList());

该方法可以筛选出值大于3 的所有数值,并返回一个集合。

2.3 - 数组如何使用stream 操作

 Integer[] arr = new Integer[]{1, 2, 3, 4, 5};
 List<Integer> result = Arrays.stream(arr).collect(Collectors.toList());
 List<Integer> result = Stream.of(arr).collect(Collectors.toList());

操作数组可以使用Arrays.strea() 的方式,或者使用Stream 通用的生成方式Stream.of()

2.4 - map

 List<String> result = sourceList
			          .stream()
			          .map(String::valueOf)
			          .collect(Collectors.toList());

类型转换的操作,可以借用map 方法,可以理解为,将整个数组一个一个的遍历,每次有一个数据到达map 方法的时候,就会执行map 方法中的处理,并将一个返回值提交给下一个方法去执行。
样例中的方法用处,是将原数组中的Long 类型数值,转换为String 类型,并将返回的String 类型数据进行组装集合。

2.5 - collect 收集操作

从2.4 的例子中,我们不难看出,collect 方法的主要用处就是组装数据,并将数据整理成目标样子。
listset 等太简单,举出样例跳过

组装List 数组

 collect(Collectors.toList())

组装Set 数组

 collect(Collectors.toSet())

组装map 集合

从现在开始,就是collect 方法常用的几种方式了
首先初始化数据

 // 创建一个Student 的实体类
 @Data // 我这里使用的lombok 简化
 public class Student {
    private Integer num;		// 学号
    private String name;		// 姓名
    private Integer roomId;		// 教室编号
 }

 // 初始化数据列表
 List<Student> sourceList = new LinkedList<>();
 sourceList.add(new Student(1, "张三", 1001));
 sourceList.add(new Student(2, "李四", 1001));
 sourceList.add(new Student(3, "王五", 1003));
 sourceList.add(new Student(4, "赵六", 1003));

将该list 转换为map 集合数据。

  Map<Integer,Student> map = sourceList
  		  .stream()
          .collect(Collectors.toMap(Student::getNum, e -> e));

组装的map 集合中,key 就是每个学生的id,value 就是每个学生的实体类。

拼接字符串

该拼接字符串的方式,极大的方便了数据拼接,省时省力。
常见于如微信支付中数据签名时拼接&字符等

 String names =sourceList
 		 .stream()
         .map(Student::getName)
         .collect(Collectors.joining(","));

这是字符串names 的值,为张三,李四,王五,赵六

数据分组

常用于整合list 集合中的重复数据进行数据分组。

 Map<Integer, List<Student>> rooms = sourceList
               .stream()
               .collect(Collectors.groupingBy(Student::getRoomId));

当前集合中,key 为教室id,value 为该教室的学生集合。

(如有需要,可以留言提交,我会补充,工作比较忙,敬请见谅)

  • 11
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值