Java Stream中的peek()方法也是用于查看每个元素,但不改变流的操作的方法。它接收一个Consumer类型的参数,该参数用于针对每个元素执行副作用操作。该方法返回一个与原始流相同的新流,因此可以进行链式操作。
使用peek()方法可以方便地在流处理过程中调试或记录某些数据。例如,在以下示例中,我们查看每个字符串元素并将其转换为大写,然后将其添加到一个新的List中:
List<String> list = Arrays.asList("apple", "banana", "orange");
List<String> newList = list.stream().peek(s -> System.out.println("Processing element: " + s)).map(String::toUpperCase).collect(Collectors.toList());
在执行过程中,peek()方法会打印出相应的调试信息,但并不会修改流中的元素。最后,我们将转换后的大写字符串添加到了新的List中。
请注意,peek()方法的作用不是为了改变流中的元素,因此您应该避免在peek()方法中进行任何有副作用的操作。在Java 8中,Stream的设计旨在提供一种非常简洁、简单且易于使用的方式来处理数据,而不是作为一个逐步构建的可变状态的构建器,因此我们应该遵循设计的原则和实践。
peek还可以修改引用:
//修改前
list = list.stream().map(listCategory -> {listCategory.setChildren(getChildrens(listCategory));return listCategory;}).collect(Collectors.toList());
//修改后
list = list.stream().peek(listCategory -> listCategory.setChildren(getChildrens(listCategory))).collect(Collectors.toList());