当前位置: 首页 > 知识库问答 >
问题:

Java 8流过滤列表中列表的值

向子安
2023-03-14

我有一个物体,如下所示

class MyObject {

    String type;
    List<String> subTypes;

}

给定MyObject的列表,是否可以使用Java8个流来过滤类型和子类型?

目前为止我有

myObjects.stream()
    .filter(t -> t.getType().equals(someotherType)
    .collect(Collections.toList());

但在这一部分中,我还希望在每个子类型上使用另一个过滤器来过滤特定子类型上的过滤器。我想不出怎么做。

例如

myObject { type: A, subTypes [ { X, Y, Z } ] }
myObject { type: B, subTypes [ { W, X, Y } ] }
myObject { type: B, subTypes [ { W, X, Z } ] }
myObject { type: C, subTypes [ { W, X, Z } ] }

我会传入匹配类型B和子类型Z,所以我希望得到一个结果-

以下当前返回列表中的2个项目。

myObjects.stream()
    .filter(t -> t.getType().equals("B")
    .collect(Collectors.toList());

但是我想在每个子类型上添加一个额外的过滤器,并且只匹配“Z”存在的地方。

共有3个答案

赵锐
2023-03-14

我在这个网站上找到了很多例子:https://zetcode.com/java/streamfilter/

引用Java流多个过滤器操作的示例

可以对一个流应用多个过滤操作。

package com.zetcode;

import java.util.Arrays;
import java.util.function.IntConsumer;

public class JavaStreamMultipleFilters {

public static void main(String[] args) {

    int[] inums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
    
    IntConsumer icons = i -> System.out.print(i + " ");
    
    Arrays.stream(inums).filter(e -> e < 6 || e > 10)
            .filter(e -> e % 2 == 0).forEach(icons);
}

}

在示例中,我们对整数流应用多个过滤器操作。

int[] inums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

我们有一个整数值数组。

IntConsumer icons = i -> System.out.print(i + " ");

IntConsumer是一种接受单个整数值参数且不返回结果的操作。

Arrays.stream(inums).filter(e -> e < 6 || e > 10)
        .filter(e -> e % 2 == 0).forEach(icons);

从带有数组的数组中创建流。流方法。执行多个筛选操作。

2 4 12 14

这些整数满足所有过滤条件。

上官培
2023-03-14

我从@kocko那里看到了公认的答案,这既是一个好答案,也是完全正确的。然而,还有一种稍微替代的方法,你只需链接过滤器

final List<MyObject> withBZ = myObjects.stream()
        .filter(myObj -> myObj.getType().equals("B"))
        .filter(myObj -> myObj.getSubTypes().stream().anyMatch("Z"::equals))
        .collect(Collectors.toList());

这基本上是在做相同的事情,但<代码>

太叔正文
2023-03-14

你可以做:

myObjects.stream()
         .filter(t -> t.getType().equals(someotherType) && 
                      t.getSubTypes().stream().anyMatch(<predicate>))
         .collect(Collectors.toList());

这将获取所有MyObject对象

  • 满足有关成员类型的标准
  • 在嵌套列表中包含对象
 类似资料:
  • 问题内容: 我想从列表中筛选元素,并使用lambda遍历每个元素的元素。例如,给定列表: 假设我只想保留列表总和大于N的元素。我尝试编写: 但我得到了错误: 在将每个元素的值分配给x,y和z时如何进行迭代?像zip之类的东西,但列表很长。 谢谢, ps我知道我可以这样写:filter(lambda x:sum(x)…,a)但这不是重点,想象一下这些不是数字而是任意元素,我想将它们的值分配给变量名。

  • 问题内容: 我开始使用django-tables2(从第一印象中就可以强烈推荐),我问自己如何实现列过滤。我找不到合适的文档,但是我确定它在那里。 问题答案: 答案有点晚了,但是无论如何…我也找不到任何合适的文档来进行列过滤。有很多方法可以做到这一点: 答:手动:我添加了一个包含要过滤的字段的表单,然后在我的视图中执行以下操作: 这很好用,但是不是那么干,因为它在视图中是硬编码的。 B.使用Sin

  • 4.5. 过滤列表 如你所知,Python 具有通过列表解析(第 3.6 节 “映射 list”)将列表映射到其它列表的强大能力。这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素。 过滤列表语法: [mapping-expression for element in source-list if filter-expression] 这是你所知所爱的 列表解析 的扩展。

  • 问题内容: 我在此论坛和Google中搜索后发布了查询,但无法解决相同的问题。 我正在尝试根据列表1中的值过滤列表2(多列)。 码 在上面的代码中,如果我提供特定值,则可以过滤,但不确定如何检查列表2中的Car Name是否在列表1中退出。 希望我面对的问题很清楚,等待指导(对于Java来说还是比较新的,因此,如果上述查询非常基础,请原谅)。 编辑, 我相信上面提供的链接3应该可以解决,但就我而言

  • 我有一个订单列表,我想使用Java8Stream和Collectors按用户分组。GroupingBy: 这将返回包含用户和订单列表的映射: 我不需要整个对象User,只需要它的username字段,它是一个字符串,所以我想获得如下内容: 我试图使用stream.map将用户映射到username字段,但无法正确实现。我怎样才能尽可能简单地做到这一点呢?