lambda的peek,filter,map,collect函数使用

@RequestMapping(value = "/list.json", method = GET)
public void list(ModelMap modelMap, String taskId, Integer currentPage, Integer pageSize) {
    Pagination pagination = Pagination.builder().current(currentPage).pageSize(pageSize).build();
    if (StringUtils.isNotBlank(taskId)) {
        return;
    }
    Map<Long, TaskBO> taskMap = Maps.newHashMap();
    Pager<RecordBO> boPager = recordManager.findRecordList(taskId, pagination);
    modelMap.addAttribute(KEY_DATA, new Pager<>(pagination,
            boPager.getList()
                    .stream()
                    .peek(recordBO -> {
                        if (!taskMap.containsKey(recordBO.getTaskId())) {
                            Optional<TaskBO> optionalTaskBO = taskManager.get(recordBO.getTaskId());
                            optionalTaskBO.ifPresent(taskBO -> taskMap.put(recordBO.getTaskId(), taskBO));
                        }

                    })
                    .filter(recordBO -> taskMap.containsKey(recordBO.getTaskId()))
                    .map(recordBO -> {
                        TaskBO taskBO = taskMap.get(recordBO.getTaskId());
                        return RecordVO.read4BO(recordBO, taskBO.getId() + ": " + taskBO.getName());
                    })
                    .collect(Collectors.toList())));

}

1. distinct: 对于Stream中包含的元素进行去重操作(去重逻辑依赖元素的equals方法),新生成的Stream中没有重复的元素;

distinct方法示意图(**以下所有的示意图都要感谢[RxJava](https://github.com/Netflix/RxJava)项目的doc中的图片给予的灵感, 如果示意图表达的有错误和不准确的地方,请直接联系我。**):

2. filter: 对于Stream中包含的元素使用给定的过滤函数进行过滤操作,新生成的Stream只包含符合条件的元素;

filter方法示意图:

3. map: 对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble。这三个方法也比较好理解,比如mapToInt就是把原始Stream转换成一个新的Stream,这个新生成的Stream中的元素都是int类型。之所以会有这样三个变种方法,可以免除自动装箱/拆箱的额外消耗;

map方法示意图:

4. flatMap:和map类似,不同的是其每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合中;

flatMap方法示意图:

5. peek: 生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数;

peek方法示意图:

6. limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;

limit方法示意图:

7. skip: 返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream;

skip方法示意图:

8. 在一起,在一起!

1List<Integer> nums = Lists.newArrayList(1,1,null,2,3,4,null,5,6,7,8,9,10);
2System.out.println(“sum is:”+nums.stream().filter(num -> num != null).
3            distinct().mapToInt(num -> num * 2).
4            peek(System.out::println).skip(2).limit(4).sum());

这段代码演示了上面介绍的所有转换方法(除了flatMap),简单解释一下这段代码的含义:给定一个Integer类型的List,获取其对应的Stream对象,然后进行过滤掉null,再去重,再每个元素乘以2,再每个元素被消费的时候打印自身,在跳过前两个元素,最后去前四个元素进行加和运算(解释一大堆,很像废话,因为基本看了方法名就知道要做什么了。这个就是声明式编程的一大好处!)。大家可以参考上面对于每个方法的解释,看看最终的输出是什么。
9. 性能问题
有些细心的同学可能会有这样的疑问:在对于一个Stream进行多次转换操作,每次都对Stream的每个元素进行转换,而且是执行多次,这样时间复杂度就是一个for循环里把所有操作都做掉的N(转换的次数)倍啊。其实不是这样的,转换操作都是lazy的,多个转换操作只会在汇聚操作(见下节)的时候融合起来,一次循环完成。我们可以这样简单的理解,Stream里有个操作函数的集合,每次转换操作就是把转换函数放入这个集合中,在汇聚操作的时候循环Stream对应的集合,然后对每个元素执行所有的函数。

 


 

### 回答1: lambda函数是一种匿名函数,可以在Python中使用map()是一个Python内置函数,它可以将一个函数应用于一个可迭代对象(如列表、元组、字典等)中的每个元素,返回一个新的迭代器。 当结合使用lambda函数map()函数时,lambda函数可以用来定义一个临时的、简短的函数,以便对map()中的每个元素进行处理。 下面是一个使用lambda函数map()函数的例子: ```python numbers = [1, 2, 3, 4, 5] squared = list(map(lambda x: x**2, numbers)) print(squared) ``` 在上面的例子中,我们定义了一个名为numbers的列表,并将其作为参数传递给map()函数。我们还定义了一个lambda函数,该函数将x作为参数,并返回x的平方。 当我们使用map()函数时,它将numbers列表中的每个元素传递给lambda函数lambda函数将每个元素平方,并将结果返回。最后,我们使用list()函数map()函数返回的迭代器转换为一个列表,并将其赋值给变量squared。 输出结果如下: ``` [1, 4, 9, 16, 25] ``` 在这个例子中,我们使用lambda函数定义了一个临时函数,以便对map()函数的每个元素进行处理。由于lambda函数是一个匿名函数,因此我们不必为它定义一个名称,从而使代码更加简洁。 ### 回答2: lambda函数是一种匿名函数,它可以在Python中快速定义简单的函数map函数是 Python 内置的高阶函数,它接受一个函数和一个可迭代对象作为参数,并对可迭代对象中的每一个元素应用该函数,然后返回一个新的可迭代对象。 lambda函数map函数在一起使用时,可以方便地对可迭代对象中的每个元素进行某种操作。 lambda函数通常作为map函数的第一个参数,在map函数的参数中使用lambda函数可以实现对可迭代对象的每个元素进行指定操作或计算,而无需事先定义一个具名的函数。 下面是一个示例,演示了如何使用lambda函数map函数。 ```python # 使用lambda函数map函数将列表中的每个元素加1 numbers = [1, 2, 3, 4, 5] result = list(map(lambda x: x + 1, numbers)) print(result) # 输出结果为 [2, 3, 4, 5, 6] ``` 在上面的示例中,我们定义了一个lambda函数,该函数将参数 x 加 1。然后,我们使用map函数将该lambda函数应用于列表 numbers 中的每个元素。最后,我们将结果转化为列表并打印输出。 总结来说,lambda函数map函数结合使用,可以方便地对可迭代对象中的每个元素进行操作,提高代码的简洁性和可读性。 ### 回答3: lambda函数是Python中的一种匿名函数,可以在需要函数对象的地方使用,这样可以简化代码的编写。而map()函数是Python内置函数,它接受一个函数作为参数,以及一个可迭代对象,然后将该函数作用在可迭代对象的每个元素上,返回一个新的可迭代对象。 lambda函数map()函数的结合使用常常可以简化代码,使得代码更加简洁和易读。下面以一个例子来说明: 假设有一个列表numbers,我们想对其中的每个元素进行平方操作。传统的方式是使用for循环来遍历列表,并对每个元素进行平方操作,最后将结果存储在一个新的列表中。代码如下: numbers = [1, 2, 3, 4, 5] squared_numbers = [] for number in numbers: squared_numbers.append(number ** 2) print(squared_numbers) 输出结果为:[1, 4, 9, 16, 25] 以上代码使用了for循环对每个元素进行了平方操作。现在我们可以使用lambda函数map()函数来简化这个过程,代码如下: numbers = [1, 2, 3, 4, 5] squared_numbers = list(map(lambda x: x ** 2, numbers)) print(squared_numbers) 输出结果为:[1, 4, 9, 16, 25] 以上代码中,lambda函数定义了输入参数x,并对x进行平方操作。map()函数接受了lambda函数和numbers列表作为参数,它将lambda函数依次作用在numbers列表的每个元素上,并返回一个新的可迭代对象。最后我们使用list()函数将可迭代对象转换为列表,得到了平方后的结果。 可以看到,使用lambda函数map()函数可以非常便捷地对可迭代对象进行批量操作,使得代码更加简洁和易读。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值