Java 8中的peek和map 在Java 8中,peek和map是Stream API中的两个方法,它们都可以在流的操作中起到类似的作用,但又有一些不同之处。 peek方法可以在流的每个元素上执行一个操作,并返回一个与原始流相同的新流。这个操作可以是一个打印语句、一个日志记录或任何其他你想要执行的操作。它通常用于调试或观察流的中间结果,而不会对流的元素进行任何修改。 map方法可以将流的每个元素映射到另一个值。这个映射可以是一个函数,它将一个元素转换为另一个元素,也可以是一个方法引用或Lambda表达式。map方法会返回一个新的流,其中包含映射后的元素。 所以,peek方法主要用于观察流的中间结果,而map方法则用于进行元素的转换。它们在使用时需要根据具体的需求选择合适的方法。

7 浏览
0 Comments

Java 8中的peek和map 在Java 8中,peek和map是Stream API中的两个方法,它们都可以在流的操作中起到类似的作用,但又有一些不同之处。 peek方法可以在流的每个元素上执行一个操作,并返回一个与原始流相同的新流。这个操作可以是一个打印语句、一个日志记录或任何其他你想要执行的操作。它通常用于调试或观察流的中间结果,而不会对流的元素进行任何修改。 map方法可以将流的每个元素映射到另一个值。这个映射可以是一个函数,它将一个元素转换为另一个元素,也可以是一个方法引用或Lambda表达式。map方法会返回一个新的流,其中包含映射后的元素。 所以,peek方法主要用于观察流的中间结果,而map方法则用于进行元素的转换。它们在使用时需要根据具体的需求选择合适的方法。

我有以下案例:有一个对象列表-ProductData,其中包含几个字段:

public class ProductData
{
....
  private String name;
  private String xref;
  //getters
  //setters
}

还有一个API,返回以下对象列表:

public class RatingTableRow
{
  private String planName;
  private String planXref;
  private int fromAge;
  private int toAge;
  private int ratingRegion;
 //constructor
 //getters
 //setters
}

但它返回的对象中的plan name字段为空,因为在提取该对象期间不允许使用。我需要通过xref将product data与RatingTableRow关联起来,以便将plan name设置到RatingTableRow中,因为我之后需要使用该对象,所以我创建了以下代码来实现这一点:

Map productByXref = plans.stream()
        .collect(toMap(ProductData::getInternalCode, Function.identity()));
return getRatingTableRows(...).stream
        .filter(ratingRow -> productByXref.containsKey(ratingRow.getPlanXref()))
        .peek(row -> {
                ProductData product = productByXref.get(row.getPlanXref());
                row.setPlanName(product.getName());
        })....;

我知道Java文档说peek不适合这些需求,但希望得到您在如何以更正确的方式完成这个任务的建议。

0