java - 基于另一个列表的 1 个列表的流过滤器

标签 java arraylist java-8 java-stream

我在这个论坛和谷歌搜索后发布了我的查询,但无法解决相同的问题。 例如:Link1 Link2 Link3

我正在尝试根据列表 1 中的值过滤列表 2(多列)。

List1:
 - [Datsun]
 - [Volvo]
 - [BMW]
 - [Mercedes]

List2: 
 - [1-Jun-1995, Audi, 25.3, 500.4, 300]
 - [7-Apr-1996, BMW, 35.3, 250.2, 500]
 - [3-May-1996, Porsche, 45.3, 750.8, 200]
 - [2-Nov-1998, Volvo, 75.3, 150.2, 100]
 - [7-Dec-1999, BMW, 95.3, 850.2, 900]

expected o/p:
 - [7-Apr-1996, BMW, 35.3, 250.2, 500]
 - [2-Nov-1998, Volvo, 75.3, 150.2, 100]
 - [7-Dec-1999, BMW, 95.3, 850.2, 900]

代码

// List 1 in above eg
List<dataCarName> listCarName = new ArrayList<>(); 
// List 2 in above eg
List<dataCar> listCar = new ArrayList<>(); 

// Values to the 2 lists are populated from excel

List<dataCar> listOutput = listCar.stream().filter(e -> e.getName().contains("BMW")).collect(Collectors.toList());

在上面的代码中,如果我提供特定值,我可以过滤,但不确定如何检查列表 2 中的 Car Name 是否存在于列表 1 中。

希望我面临的问题很清楚,等待指导(我对 Java 还比较陌生,因此如果上面的查询非常基本,请原谅)。

编辑 我相信上面提供的 link-3 应该可以解决,但就我而言,它不起作用。可能是因为 list-1 中的值填充为 org.gradle04.Main.Cars.dataCarName@4148db48 ..等 仅当我通过调用 getName 方法在列表 1 上执行 forEach 时,我才能获取人类可读格式的值。

最佳答案

不清楚为什么你有 List<DataCarName>第一名而不是 List/Set<String> .

您必须提供的谓词必须检查相应的数据汽车实例的名称是否在列表中。

e -> e.getName().contains("BMW")只会检查数据汽车的名称是否包含 BMW,这不是您想要的。那么您的第一次尝试可能是

e -> listCarName.contains(e.getName())

但是自从 listCarNameList<DataCarName>e.getName()一个字符串(我猜),结果你会得到一个空列表。

您的第一个选择是更改谓词,以便从数据汽车名称列表中获取流,将它们映射到其字符串表示形式,并检查这些名称中的任何一个是否与您当前正在过滤的当前数据汽车实例的名称相对应:

List<DataCar> listOutput =
    listCar.stream()
           .filter(e -> listCarName.stream().map(DataCarName::getName).anyMatch(name -> name.equals(e.getName())))
           .collect(Collectors.toList());

现在这非常昂贵,因为您为数据汽车流管道中的每个实例创建一个流。更好的方法是构建一个 Set<String>前面输入汽车名称,然后只需使用 contains作为该集合的谓词:

Set<String> carNames = 
    listCarName.stream()
               .map(DataCarName::getName)
               .collect(Collectors.toSet());

List<DataCar> listOutput =
     listCar.stream()
            .filter(e -> carNames.contains(e.getName()))
            .collect(Collectors.toList());

关于java - 基于另一个列表的 1 个列表的流过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58075594/

相关文章:

java - Log4j 找不到记录器的附加程序 (org.apache.hadoop.util.shell)

java - 通过 org.json 将字符串转换为 ArrayList

java - 使用 Stream 从对象列表中查找最常见的属性值

java - 在 AWS Lambda 中集成 Google Guice

java - ElasticSearch - 查询时如何匹配所有子词

java - classnotfoundException 获取如果我在成功下载后启动动态模块中的 Activity

java - KStream-KTable 使用 Exactly Once 配置内部连接丢失的消息

Java:通用 ArrayLists 是否比 LinkedLists 迭代速度更快?

java - 如何在每个 Arraylist 项目中删除\n

java - 将列表值顺序传递给单值消费者的最佳方式?