【问题标题】:Java 8 streaming: How to convert list of objects to a list of its selected propertiesJava 8 流式传输:如何将对象列表转换为其选定属性的列表
【发布时间】:2017-09-11 15:18:11
【问题描述】:

我有课

class Person {
   // get/set omitted for simplicity
   public String firstName;
   public String lastName;
}

我也有这些对象的列表

List<Person> list ...

我需要使用以下流进行转换

List<Person> list ...
List<String> firstLastNames = list.stream()....

所以我的 List firstLastNames 将包含此列表中的名字和姓氏。所以。

System.out.println(firstLastNames); // will give me -> "John", "Smith", "Jessica", "Jones".. etc.

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    这样的事情怎么样

    stream.stream().flatMap(p -> Stream.of(p.firstName, p.lastName)).collect(Collectors.toList());
    

    【讨论】:

    • 首先,点赞。一切正常,但您应该删除 new Object(...) 表达式。
    • @Oleg:链接答案的替代方案专门用于收集到地图中,其中flatMap 变体需要两个值的临时持有者。由于收集到List 时不是这种情况,因此最好使用更简单的flatMap 方法。
    • @Oleg:您几乎不会测量任何显着的性能差异。但是如果你关心最细微的性能,循环会更快。如果你想使用流 API,使用flatMap(…).collect(Collectors.toList()) 是直截了当的。此外,您在说哪个 javadoc? Collectors.toList() 的内部工作原理以及实际返回的 List 实现类型是有意未指定的,并且在未来版本中可能会比 ArrayList 更快。
    • @Oleg:这是一个示例,帮助您了解用法。这并不意味着您应该始终推出手动收集器,尽管为此目的有一个内置收集器。现在应该自己思考一下,为什么Collectors.toList() 存在,如果建议真的是总是自己重新实现该操作?
    • @Oleg:再次,链接的答案是关于收集到 Map。此外,Brain Goetz 将该方法与错误的reduce 方法进行了比较。他绝不建议总是推出您自己的自定义收集器,而不是使用内置收集器。没有人说重新实现的收集器是错误的,只是建议尽可能使用现有的收集器,而不是重新发明轮子。一如既往。
    【解决方案2】:

    如果您想要一个真正的属性对象 (java.util.Properties),您可以执行以下操作。请注意,由于您使用的是属性,因此您将无法通过这种方式拥有重复的记录。

     public static void main(String args[])
    {
        // make some people
        Person john = new Person("John", "Smith");
        Person mary = new Person("Mary", "Richards");
    
        List<Person> people = new ArrayList<Person>();
        people.add(john);
        people.add(mary);
    
        Properties peopleProps = new Properties();
        for (Person person : people)
        {
            peopleProps.setProperty(person.getfName(), person.getlName());
        }
    
        System.out.println(peopleProps);
    
    }
    

    【讨论】:

    • 这实际上与问题无关。
    • 另外:这使用名字作为键值结构中的键。有两个名字相同的Persons 会搞砸一切。
    • 从技术上回答标题的答案与问题无关,您需要阅读所有内容并回答实际问题。
    • 明白了,我很好奇为什么要以这种方式列出名称,是否有比列表更好的数据结构?我自己仍在使用 java 7,所以也许有一些我不知道的东西,但是如果列表中有 2000 多个“记录”,你会如何实际使用它?
    • 我不知道为什么 OP 需要这个,并且根据他的需要可能会有更好的数据结构,但是 2000 个人可以说每个名字和姓氏 10 个字母(故意夸大)会更少超过 80 KB。在现代计算机上不是问题,您可以以任何您喜欢的方式使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2019-12-16
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    相关资源
    最近更新 更多