【问题标题】:Equivalent lambda expression, to get a property of every object in a list等效的 lambda 表达式,用于获取列表中每个对象的属性
【发布时间】:2018-10-24 18:10:28
【问题描述】:

这个 for 循环在 Java 中的等效 lambda 表达式是什么?
我只想在一行中打印列表对象的名称。

for(Attribute attr : dataSet.getAttributeList()){
            System.out.print(attr.getName() + " ");
        }

我尝试了以下但没有任何运气,我只得到了流的身份哈希码。 Arrays.asList(dataSet.getAttributeList().stream().map(p -> p.getName()));

【问题讨论】:

  • 您是否覆盖了toString()
  • Attribute 是什么?你能提供课程吗?
  • 你应该使用Arrays.asList(x) 而不是x.collect(Collectors.toList())。如果是这样,我可以把它写成答案,但是……嗯。我猜是未读文档的案例。
  • dataSet.getAttributeList().forEach(attr -> System.out.print(attr.getName() + " "));?
  • 也许docs.oracle.com/javase/8/docs/api/java/util/stream/… ?顶部的第一个代码 sn-p 显示了如何使用 Collector 创建列表。

标签: java list lambda java-8


【解决方案1】:

假设您的 name 属性是 String,请继续使用您的 Stream 管道。使用内置的 Collector 收集名称,在每个元素之间使用分隔符连接值:Collectors.joining

返回一个Collector,它按照遇到的顺序连接输入元素,由指定的分隔符分隔。

你可以去掉不必要的Arrays.asList,反正是不正确的;它需要一个数组,而不是流或字符串,作为参数。

System.out.println(
    dataSet.getAttributeList().stream()
        .map(p -> p.getName())
        .collect(Collectors.joining(" "))
);

您也可以选择使用方法引用而不是 lambda 表达式:

.map(Attribute::getName)

【讨论】:

    【解决方案2】:

    如果您已覆盖 toString,您可以使用以下方法获取整个对象:

    dataSet.getAttributeList().forEach(System.out::println);
    

    如果你还没有:

    dataSet.getAttributeList().forEach(Attribute::getName));
    

    【讨论】:

    • 你不需要.stream().forEach(),它应该只是.forEach()Collection 有自己的 forEach() 继承自 Iterable
    • 由于某种原因,当我使用 forEach 时,我得到 println 无法解决。我应该如何以及为什么要覆盖该方法以及使用哪个?
    • 如果您想要对象的全部内容,您需要覆盖 Attribute 类中的 toString。你能重新检查一下语法吗,它对我有用。
    • 我做到了,我不断收到无法解析方法'println(void)'。 tnx 无论如何都要付出努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多