lambda Java 8,如何映射一个列表,该列表是过滤操作的结果字段
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了lambda Java 8,如何映射一个列表,该列表是过滤操作的结果字段,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1572字,纯文字阅读大概需要3分钟。
内容图文
![lambda Java 8,如何映射一个列表,该列表是过滤操作的结果字段](/upload/InfoBanner/zyjiaocheng/796/8b82fe5fc92748e2bf8e66b0524c2c76.jpg)
我有一个类似目录的对象层次结构,其中每个对象都有一个名称字段.
class A {
List<A> list;
String name;
}
A{A{A{A...}AA},A{AAA},A{AAA}} // the depth is finite (~4)
我想提供一组方法,返回给定名称的任何父元素的子名称列表(a.getName()).
所以对于1级我有
a.getAs().stream().map(a1 -> a1.getName()).collect(Collectors.toList());
2级我已经遇到过麻烦:
a1.getAs().stream().filter(a2 -> a2.getName() == name)
现在我想访问As并将它们映射到他们的名字,但我不知道如何
编辑:
我刚刚意识到,从第三级开始就不可能只提供一个名称来找到列表.我需要每个级别的名称才能导航到可以收集子列表的节点.
一方面,我可以将所有对象保存在一个Set中,并使用id访问它们.他们仍然会互相引用.另一方面,由于不知道根元素,我无法使结构正确.
我想我必须重新思考这个问题.
解决方法:
你可以这样做:
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());
}
但是如果A节点下的名称是唯一的,则应考虑维护Map< String,A>,从子名称映射到实际子项,而不是List< A>.这将通过唯一的名称/ ID遍历路径,就像node.get(name1).get(name2)一样简单.如果您合并模式匹配,则上述方法的逻辑仍然有用,模式匹配不需要具有唯一结果.
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());
}
内容总结
以上是互联网集市为您收集整理的lambda Java 8,如何映射一个列表,该列表是过滤操作的结果字段全部内容,希望文章能够帮你解决lambda Java 8,如何映射一个列表,该列表是过滤操作的结果字段所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。