Java8 中包含流的嵌套列表
Nested lists with streams in Java8
我有一个对象 A 列表。此列表中的每个对象 A 都包含对象 B 的列表,对象 B 包含对象 C 的列表。对象 C 包含一个我想用来过滤的属性名称 java 8.
如何使用流在 java8 中编写以下代码来避免嵌套循环:
C c1 = null;
String name = "name1"
for (A a: listOfAObjects) {
for (B b: a.getList()) {
for (C c: b.getPr()) {
if (c.getName().equalsIgnoreCase(name)) {
c1= c;
break;
}
}
}
}
您可以使用两个 flatMap
然后一个 filter
然后您可以选择第一个或者如果没有结果 return null
:
C c1 = listOfAObjects.stream()
.flatMap(a -> a.getList().stream())
.flatMap(b -> b.getPr().stream())
.filter(c -> c.getName().equalsIgnoreCase(name))
.findFirst()
.orElse(null);
listOfObjectsA.stream()
.flatMap(a -> a.getListOfObjectsB.stream())
.flatMap(b -> b.getListOfObjectsC().stream())
.filter(c -> name.equals(c.getName()))
.findAny()
.orElse(....)
你可以用 flatMap
来完成。
我用 Company
做了一个例子,其中包含 Person
的列表:
public static void main(String[] args) {
List<Company> companies = Arrays.asList(
new Company(Arrays.asList(new Person("Jon Skeet"), new Person("Linus Torvalds"))),
new Company(Arrays.asList(new Person("Dennis Ritchie"), new Person("Bjarne Stroustrup"))),
new Company(Arrays.asList(new Person("James Gosling"), new Person("Patrick Naughton")))
);
List<String> persons = companies.stream()
.flatMap(company -> company.getPersons().stream())
.map(Person::getName)
.collect(Collectors.toList());
System.out.println(persons);
}
输出:
[Jon Skeet, Linus Torvalds, Dennis Ritchie, Bjarne Stroustrup, James Gosling, Patrick Naughton]
我有同样的任务,但我有一个嵌套的 class。而且我必须在嵌套集合中使用过滤器过滤对象。
因此,我必须获得在集合中具有匹配项的项目。
例如:
public class RootElement {
private String name;
private List<String> nestedElements;
//getters / setters and constructors
}
初始化集合的元素:
List<RootElement> elements = Arrays.asList(
new RootElement("first", Arrays.asList("one", "two", "three")),
new RootElement("second", Arrays.asList("four", "one", "two")));
过滤器示例:
String filterParam = "four";
List<RootElement> filtered = elements.stream()
.flatMap(root -> root.getNestedElements()
.stream()
.filter(nested -> nested.equalsIgnoreCase(filterParam))
.map(filteredElement -> new RootElement(root.getName(), root.getNestedElement())))
.collect(Collectors.toList());
希望对大家有所帮助。
我有一个对象 A 列表。此列表中的每个对象 A 都包含对象 B 的列表,对象 B 包含对象 C 的列表。对象 C 包含一个我想用来过滤的属性名称 java 8.
如何使用流在 java8 中编写以下代码来避免嵌套循环:
C c1 = null;
String name = "name1"
for (A a: listOfAObjects) {
for (B b: a.getList()) {
for (C c: b.getPr()) {
if (c.getName().equalsIgnoreCase(name)) {
c1= c;
break;
}
}
}
}
您可以使用两个 flatMap
然后一个 filter
然后您可以选择第一个或者如果没有结果 return null
:
C c1 = listOfAObjects.stream()
.flatMap(a -> a.getList().stream())
.flatMap(b -> b.getPr().stream())
.filter(c -> c.getName().equalsIgnoreCase(name))
.findFirst()
.orElse(null);
listOfObjectsA.stream()
.flatMap(a -> a.getListOfObjectsB.stream())
.flatMap(b -> b.getListOfObjectsC().stream())
.filter(c -> name.equals(c.getName()))
.findAny()
.orElse(....)
你可以用 flatMap
来完成。
我用 Company
做了一个例子,其中包含 Person
的列表:
public static void main(String[] args) {
List<Company> companies = Arrays.asList(
new Company(Arrays.asList(new Person("Jon Skeet"), new Person("Linus Torvalds"))),
new Company(Arrays.asList(new Person("Dennis Ritchie"), new Person("Bjarne Stroustrup"))),
new Company(Arrays.asList(new Person("James Gosling"), new Person("Patrick Naughton")))
);
List<String> persons = companies.stream()
.flatMap(company -> company.getPersons().stream())
.map(Person::getName)
.collect(Collectors.toList());
System.out.println(persons);
}
输出:
[Jon Skeet, Linus Torvalds, Dennis Ritchie, Bjarne Stroustrup, James Gosling, Patrick Naughton]
我有同样的任务,但我有一个嵌套的 class。而且我必须在嵌套集合中使用过滤器过滤对象。 因此,我必须获得在集合中具有匹配项的项目。
例如:
public class RootElement {
private String name;
private List<String> nestedElements;
//getters / setters and constructors
}
初始化集合的元素:
List<RootElement> elements = Arrays.asList(
new RootElement("first", Arrays.asList("one", "two", "three")),
new RootElement("second", Arrays.asList("four", "one", "two")));
过滤器示例:
String filterParam = "four";
List<RootElement> filtered = elements.stream()
.flatMap(root -> root.getNestedElements()
.stream()
.filter(nested -> nested.equalsIgnoreCase(filterParam))
.map(filteredElement -> new RootElement(root.getName(), root.getNestedElement())))
.collect(Collectors.toList());
希望对大家有所帮助。