案例描述
今天跟着黑马程序员的视频,完成“瑞吉外卖”项目的菜品信息管理模块的时候,遇到了一个比较陌生的写法
用到了Java8的新特性 stream().map((item) -> {}).collect()
-
List<DishDto> collect = records.stream().map((item) -> {
-
DishDto
dishDto
=
new
DishDto();
-
BeanUtils.copyProperties(item,dishDto);
-
Long
categoryId
= item.getCategoryId();
-
Category
category
= categoryMapper.selectById(categoryId);
-
-
if (category !=
null) {
-
String
categoryName
= category.getName();
-
dishDto.setCategoryName(categoryName);
-
}
-
-
return dishDto;
-
}).collect(Collectors.toList());
等价写法
-
List<DishDto> collect =
new
ArrayList<>();
-
for (
int
i
=
0; i < records.size(); i++) {
-
DishDto
dishDto
=
new
DishDto();
-
BeanUtils.copyProperties(records.get(i),dishDto);
-
Long
categoryId
= records.get(i).getCategoryId();
-
Category
category
= categoryMapper.selectById(categoryId);
-
if (category !=
null) {
-
String
categoryName
= category.getName();
-
dishDto.setCategoryName(categoryName);
-
}
-
collect.add(dishDto);
-
}
-
dishDtoPage.setRecords(collect);
其实,说白了,我们就是要干一件事,就是把records这个数组遍历一下,把 records 里面的属性字段赋值给dishDto, 并且添加一些“内容”。
stream().map().collect()
抽离出本质
-
mylist.stream().map((item)->{
-
return item;
-
}).collect(Collectors.toList());
steam()
无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。
为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。
map()
map 方法用于映射每个元素到对应的结果
-
List<Integer> numbers = Arrays.asList(
3,
2,
2,
3,
7,
3,
5);
-
List<Integer> squares = numbers.stream().map((i) -> {
-
i = i*i;
-
return i;
-
}).distinct().collect(Collectors.toList());
-
System.out.println(squares);
-
// [9, 4, 49, 25]
简洁一点可以这样子:省略掉 ()-{}
-
List<Integer> numbers = Arrays.asList(
3,
2,
2,
3,
7,
3,
5);
-
List<Integer> squares = numbers.stream().map( i -> i*i).distinct()
-
.collect(Collectors.toList());
-
System.out.println(squares);
如果不理解,我们可以再看一个例子!
filter()
filter 方法用于通过设置的条件过滤出元素
-
List<String>strings = Arrays.asList(
"abc",
"",
"bc",
"efg",
"abcd",
"",
"jkl");
-
// 获取空字符串的数量
-
long
count
= strings.stream().filter(string -> string.isEmpty()).count();
-
// 2
-
System.out.println(count);
更多的例子,在菜鸟里面都有,就不搬了......
Java 8 Stream | 菜鸟教程 (runoob.com)https://www.runoob.com/java/java8-streams.html
.collect(Collectors.toList())
将流中的所有元素导出到一个列表( List )
中
-
Stream<String> s = Stream.of(
"Geeks",
"for",
"GeeksforGeeks",
"Geeks Classes");
-
List<String> myList = s.collect(Collectors.toList());
-
-
// [Geeks, for, GeeksforGeeks, Geeks Classes]
-
System.out.println(myList);