java8流式循环
1.流式循环
perms.stream()
.filter(perm -> Objects.equals(perm.getType(), "菜单"))//过滤掉有按钮的行对象
.forEach(menus::add)
//.collect(Collectors.toList()); 属性将其转化为和遍历类型相同的集合类型
//.map(item -> { 将对象转换为另一种形式,对其赋值
// item.setChildMenuItems(getChildMenuItems(item.getId()));
// return item;
// })
//或
perms.forEach(e -> {
});
2. .map与.peek区别
在Java Stream中,.map
和 .peek
是两种不同的操作,它们有一些关键的区别:
- 返回值类型:
.map
返回一个新的Stream,其中包含经过映射函数处理后的元素。.peek
返回的仍然是原始的Stream,但在处理每个元素时可以执行副作用。
- 副作用:
.map
是一个中间操作,它对每个元素应用映射函数,并生成一个新的Stream。它的目的是转换元素而不产生副作用。.peek
也是中间操作,但是它允许在处理元素时执行副作用操作,例如调试或记录每个元素的值。
- 使用场景:
.map
适用于需要对元素执行映射操作的场景,例如将每个元素转换为另一种类型或提取特定的信息。.peek
适用于在处理元素时执行额外的操作,而不改变元素本身,例如调试、记录或验证。
- 延迟执行:
- 由于Stream是惰性求值的,这两种操作都是延迟执行的。它们只有在终端操作(如
.collect
、.forEach
等)被调用时才会实际执行。
- 由于Stream是惰性求值的,这两种操作都是延迟执行的。它们只有在终端操作(如
下面是一个简单的示例,演示了.map
和 .peek
的使用:
javaCopy codeList<String> words = Arrays.asList("apple", "banana", "orange");
// 使用.map进行转换
List<Integer> wordLengths = words.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(wordLengths); // 输出: [5, 6, 6]
// 使用.peek执行副作用
List<Integer> lengthsWithPeek = words.stream()
.map(String::length)
.peek(length -> System.out.println("Length: " + length))
.collect(Collectors.toList());
System.out.println(lengthsWithPeek); // 输出: Length: 5, Length: 6, Length: 6, [5, 6, 6]
在上述示例中,.map(String::length)
将字符串转换为它们的长度,而 .peek(length -> System.out.println("Length: " + length))
在处理每个元素时打印长度,但它最终返回的Stream仍然包含转换后的元素。
OK !!! 收尾!!!
若有误区或不能解决,私信我,远程协助你!!!