【问题标题】:struggling to understand "List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());"难以理解“List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());”
【发布时间】:2016-03-11 00:09:27
【问题描述】:

我在看Oracle Java Tutorial on List interface,遇到了如下语法:

List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());

本教程只提到这是一个将一些名称聚合到列表中的示例,但没有进一步解释。我一直在努力理解这个陈述实际上是如何工作的。有人可以向我解释一下吗?

【问题讨论】:

  • 那太宽泛了。如果你什么都不懂,那就学吧。如果有具体内容,请具体说明。
  • 你不明白什么?你了解流的工作原理吗?

标签: java list dictionary java-stream


【解决方案1】:
  • 第一种方法people.stream() 创建一个Stream&lt;Person&gt;
  • 转换由map() 指定。流中的每个Person 都将通过调用getName() 转换为StringPerson::getName 语法是“方法引用”,在这种情况下具有 Function&lt;Person,String&gt; 类型。结果是Stream&lt;String&gt;
  • 使用工厂方法Collectors.toList()创建了一个Collector&lt;String,?,List&lt;String&gt;&gt;
  • collect()方法是终端操作;调用它会导致评估 Stream。收集结果,生成一个新的List&lt;String&gt;

【讨论】:

    【解决方案2】:
    List<String> list =
    people.stream() // gets a Stream<Person> 
        .map(Person::getName) // for each Person object call the getName() method - producing a Stream<String> of the result of that method call
        .collect(Collectors.toList()); // collect that Stream<String> into a List, which is stored in the local variable declared as list
    

    这可以写成命令式

    List<String> list = new ArrayList<>();
    for (Person person : people) {
        list.add(person.getName());
    }
    

    【讨论】:

    • 如果 Java 的流利用惰性行为,则 2 的行为并不总是相同,但在这里的所有意图和目的,它们是等价的。
    猜你喜欢
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2015-03-20
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多