当前位置: 首页 > 面试题库 >

Java 8窥视与地图

夹谷山
2023-03-14
问题内容

我有以下情况:有一个对象列表-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

}

但它会返回带有空计划名称字段的对象,因为在提取此对象期间不允许使用该名称。我需要通过外部参照将产品数据与RatingTableRow链接,以便将计划名称设置为RatingTableRow,因为稍后需要使用此对象,因此我创建了以下代码来做到这一点:

Map<String, ProductData> 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不满足这些需求,但希望获得有关如何以更正确的方式完成此任务的建议。


问题答案:

peek记录在案的原因 主要是出于调试目的

最终在内部进行处理的某些内容peek可能根本不符合终端操作的条件,并且流仅由终端操作执行。

首先假设一个简单的例子:

    List<Integer> list = new ArrayList<>();
    List<Integer> result = Stream.of(1, 2, 3, 4)
            .peek(x -> list.add(x))
            .map(x -> x * 2)
            .collect(Collectors.toList());

    System.out.println(list);
    System.out.println(result);

一切看起来都很好吧?因为在这种情况下peek将运行 所有元素 。但是,当您添加一个filter(然后忘了peek做什么)时会发生什么:

 .peek(x -> list.add(x))
 .map(x -> x * 2)
 .filter(x -> x > 8) // you have inserted a filter here

您正在peek为每个元素执行,但不 收集任何 元素。您确定要吗?

这可能会变得更加棘手:

    long howMany = Stream.of(1, 2, 3, 4)
            .peek(x -> list.add(x))
            .count();

    System.out.println(list);
    System.out.println(howMany);

在Java-8中,该列表已填充, 但在jdk-9中 peek根本没有调用。由于您未使用filter或未flatmap修改Stream
count的大小,只需要它的大小即可; 因此根本不用偷看 。因此,依靠peek是一个非常糟糕的策略。



 类似资料:
  • 问题内容: 我有一个服务器,我想在读取字节之前先查看一下它,以检查它是客户端尝试使用的纯文本协议还是SSL / TLS。 检查http://golang.org/pkg/net/,似乎该界面没有类似的内容。我知道我可以使用,但是我想通过TLS Conn来证明客户端使用的是SSL / TLS,并且可以从原始目录中读取,因此握手将失败。 那么,有什么方法可以窥探Go语言(类似于C / C ++套接字)

  • Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。 本文档将通过介绍Scrapy背后的概念使您对其工作原理有所了解, 并确

  • 我试图对对象中的每个条目执行映射操作。 我需要从键中去掉前缀,并将值从一种类型转换为另一种类型。我的代码从 映射实例并使用,这看起来很难看。 还有更好的选择吗?使用for循环似乎更好: 我应该避免使用流API吗?还是我错过了更好的方式?

  • 我试图使用

  • 我有多个消息在我的服务总线主题,我想处理这个消息一个一个,在一个服务总线触发器,它应该得到所有的消息,没有被处理。而且由于我正在进行测试和调试,我不希望消息被完成,也就是说,如果它没有完成,它会留在主题中供任何其他服务使用。 我已经开始使用带有服务总线主题触发器的Azure功能应用程序,并且已经向上移动到这里,在这里我获得了我日志中的所有消息,但是一旦完成,我没有获得任何其他消息,因为所有消息都已

  • 我试图翻译这个(简化)代码使用Java-8流: 以下是我尝试过的: 但以上给出了所有