访问List <list <person>&gt;中对Person对象的每个名称的访问权限在Java 8的一行中

时间:2017-08-16 01:43:00

标签: java java-8

给定人员列表,如何在不使用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;
        }
    }
}

4 个答案:

答案 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>,然后使用mapname取出Person。从那时起它几乎取决于在迭代期间会发生什么,如果它真的是System.out.println,那么没有什么能比forEach更好。实际上,forEach是唯一正确的事情。那就是

llist.stream().flatMap(Collection::stream).map(Person::getName).forEach(System.out::println);