lambdajava8,如何映射一个列表,该列表是过滤器操作结果的一个字段

lambdajava8,如何映射一个列表,该列表是过滤器操作结果的一个字段,java,lambda,java-8,Java,Lambda,Java 8,我有一个类似目录的对象层次结构,其中每个对象都有一个名称字段 class A { List<A> list; String name; } A{A{A{A...}AA},A{AAA},A{AAA}} // the depth is finite (~4) 2级我已经遇到以下问题: a1.getAs().stream().filter(a2 -> a2.getName() == name) 现在我想访问As并将它们映射到它们的名称,但我不知道如何操作 编辑:

我有一个类似目录的对象层次结构,其中每个对象都有一个名称字段

class A {
    List<A> list;
    String name;
}

A{A{A{A...}AA},A{AAA},A{AAA}} // the depth is finite (~4)
2级我已经遇到以下问题:

a1.getAs().stream().filter(a2 -> a2.getName() == name)
现在我想访问As并将它们映射到它们的名称,但我不知道如何操作

编辑: 我刚刚意识到,从第三层开始,仅仅提供一个名字是不可能找到列表的。我需要每个级别的名称才能导航到可以收集子列表的节点。 一方面,我可以将所有对象保存在一个集合中,并使用id访问它们。它们仍然可以相互引用。另一方面,由于不知道根元素,我无法获得正确的结构


我想我必须重新思考这个问题。

它只适用于层次结构的一个级别:

public List<A> getSubcategoriesByParentName(A category, String name) {
    return category.getSubcategories()
                   .stream()
                   .filter(subcategory -> subcategory.getName().equals(name))
                   .collect(Collectors.toList());
}
正如您所看到的,需要递归,它不是为流API工作的


当然,意识到深度,我们可以访问所有级别(通过多次使用
flatMap(s->s.getSubcategories().stream())
),但它看起来很难看。

您可以这样做:

public static List<String> getChildNames(A node, String... path) {
    Stream<A> s = node.getAs().stream();
    for(String name: path)
        s = s.filter(a -> a.getName().equals(name)).flatMap(a -> a.getAs().stream());
    return s.map(A::getName).collect(Collectors.toList());
}

getAs
是否返回
列表
?你为什么要用流API来实现这一点?你能在上一句话中解释一下你想用过滤器实现什么吗?@Andrew Tobilko:是的,是的。流API效率更高,可读性更好,而且可以并行执行。。。。在某些方面cases@ErnestKiwele给定一个字符串“name”,我从匹配它的列表中筛选出一个条目,然后我想访问distinct filtered对象中的列表,以便仅将列表元素映射到它们的名称。我总是从根开始,一路往下潜到我感兴趣的层次,如果你可以通过将
flatmap
filter
部分放在一个循环中并只在最末端收集来添加更多的“层次层次”。因为深度被认为是有限的(最多4),在没有任何递归的情况下,最多链接四个
flatMap
步骤应该不会有任何问题。:-)@迪迪埃L:不幸的是,这里没有太多帮助,因为我们仍然需要将它与
getName()
结合起来。我真的希望,
谓词
有一个方法可以用一个
函数
组成它……在我们的代码库中,我们有这样一个实用方法,但是这样的例子应该是独立的。名称的唯一性只能在同一个列表中得到保证。以上代码经过测试,是满足初始需求的有效解决方案。尽管@Andrew Tobilko部分提到了平面图链接方法。我不确定我应该接受谁的答案,“在同一个列表中”正是我在
A
节点下的意思。这意味着您可以用映射替换列表,因为每个
a
实例都有自己的映射。至于接受哪个答案,完全由你自己选择。请参阅:“接受答案并不意味着是表明问题已经得到完美回答的决定性和最终陈述。它只是意味着作者收到了对他或她本人有用的答案。”。
category.getSubcategories().stream()
        .flatMap(s -> s.getSubcategories().stream())
        .filter(s -> s.getName().equals(name))
        .collect(Collectors.toList());
public static List<String> getChildNames(A node, String... path) {
    Stream<A> s = node.getAs().stream();
    for(String name: path)
        s = s.filter(a -> a.getName().equals(name)).flatMap(a -> a.getAs().stream());
    return s.map(A::getName).collect(Collectors.toList());
}
public static List<String> getChildNames(A node, String... pathPatterns) {
    Stream<A> s = node.getAs().stream();
    for(String namePattern: pathPatterns) {
        Pattern compiledPattern = Pattern.compile(namePattern);
        s = s.filter( a -> compiledPattern.matcher(a.getName()).find())
             .flatMap(a -> a.getAs().stream());
    }
    return s.map(A::getName).collect(Collectors.toList());
}