给定人员列表,如何在不使用java8中的forEach的情况下迭代一行代码中的所有名称? 请在下面的代码中的注释中查看问题。
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<ArrayList<Person>> llist = new ArrayList<ArrayList<Person>>();
ArrayList<Person> list1 = new ArrayList<>();
list1.add(new Person("aaa"));
list1.add(new Person("bbb"));
ArrayList<Person> list2 = new ArrayList<>();
list2.add(new Person("ccc"));
list2.add(new Person("ddd"));
llist.add(list1);
llist.add(list2);
// how to change this part into one line in java 8?
llist.forEach(l -> {
l.forEach(p -> {
System.out.println(p.getName());
});
});
}
static class Person {
String name;
Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public String toString() {
return "" + this.name;
}
}
}
答案 0 :(得分:4)
&#34;一行&#34;不使用forEach的代码:
llist.stream().flatMap(Collection::stream).peek(System.out::println).collect(Collectors.toList());
答案 1 :(得分:2)
在这种特殊情况下,您可以将其简化为
llist.forEach(l -> l.forEach(System.out::println));
(因为toString()
类的Person
方法与getName()
返回的方法基本相同。)
答案 2 :(得分:0)
没有forEach,所以这样的事情?
llist.stream().filter(ll -> {
ll.stream().filter(l -> {
System.out.println("do something on " + l);
return true;
}).toArray();
return true;
}).collect(Collectors.toList());
答案 3 :(得分:0)
不完全有用,但根据要求没有forEach :
Iterator<String> iterator = llist.stream().flatMap(Collection::stream).map(Person::getName).iterator(); while(iterator.hasNext());
甚至没有一个班轮因为将while
放在同一条线上而作弊。
这里的要点是使用flatMap(Collection::stream)
将List<List<Person>>
展平为List<Person>
,然后使用map
将name
取出Person
。从那时起它几乎取决于在迭代期间会发生什么,如果它真的是System.out.println
,那么没有什么能比forEach
更好。实际上,forEach
是唯一正确的事情。那就是
llist.stream().flatMap(Collection::stream).map(Person::getName).forEach(System.out::println);