他们的相同之处在于,都是遍历流中的每个元素
不通的地方在于,map接受的参数是一个带返回值的函数,map的执行结果是将参数中函数的执行结果;
而peek遍历流中每个元素,其遍历过程中对每个元素进行操作,但是其返回值仍然是流本身。
@Test
void peekTest () {
// peek 接收一个Consumer,而map接收一个Function。
// Consumer是没有返回值的,它只是对Stream中的元素进行某些操作,但是操作之后的数据并不返回到Stream中,所以Stream中的元素还是原来的元素。
// 而Function是有返回值的,这意味着对于Stream的元素所有操作都会作为新的结果返回到Stream中
// 换句话说,peek是一个有输入参数,无返回值的方法,方法的入参是不会发生变化的,但是入场的属性是语序发生改变的;这就是peek string不会发生变化,而peek object会发生变化的原因
List<User> users = Stream.of(new User("Tom", 1), new User("Susan", 2), new User("Jack", 3)).collect(Collectors.toList());
System.out.println("------map method-------");
users.stream().map(u -> {
u.setName(u.getName().toUpperCase(Locale.ROOT));
return u.getName();
}).collect(Collectors.toList()).forEach(System.out::println);
System.out.println("------peek method-------");
users.stream().peek(u -> u.setName(u.getName())).collect(Collectors.toList()).forEach(t -> System.out.println(t.getName()));
}
网友评论