Java 更改集合中的值<&燃气轮机;

Java 更改集合中的值<&燃气轮机;,java,collections,Java,Collections,我有一个包含项目对象的集合:set 类项有一个返回字符串的方法getName()。 我想使用以下方法将Set转换为Set Item#getName() 有没有比使用forEach更好的方法 itemSet.stream().map(Item::getName).collect(Collectors.toSet()) 使用Java流对此进行解释: .stream从集合中一个接一个地提取每个项目。请参阅Oracle发布的这篇文章 .map对集合中的每个对象流调用指定的方法(getName)。此项

我有一个包含项目对象的集合:
set
类项有一个返回字符串的方法
getName()
。 我想使用以下方法将
Set
转换为
Set
Item#getName()

有没有比使用forEach更好的方法

itemSet.stream().map(Item::getName).collect(Collectors.toSet())
使用Java流对此进行解释:

  • .stream
    从集合中一个接一个地提取每个项目。请参阅Oracle发布的这篇文章
  • .map
    对集合中的每个对象流调用指定的方法(
    getName
    )。此项的输出是每个项的name属性,显然是方案中的
    字符串
    对象
  • .collect
    捕获每个名称输出,并将它们放入一个新的
    集合
    对象中。这个新的
    集合
    在这个代码完成时返回

Set result=itemSet.stream().map(item->item.getName()).collect(Collectors.toSet())
应该解决这个问题。谢谢:)方法引用(
.map(Item::getName)
)可能比lambda(
.map(Item->Item.getName())
)更好,但任何一种方法都有效。亲爱的投票人,请在投票时留下批评。这可能是一个看似简单的问题,但(a)简单的问题在堆栈溢出上肯定是允许的,并且(b)它导致了关于Java流的问题。@basil bourque感谢您充实了我的答案-非常简洁地解释了这些步骤!好吧,让我们用一个漂亮的图表再进一步。受那篇链接文章的启发。我真的很喜欢这个答案和图表。但是,我认为这些概念是错误的。从集合中提取项目的不是
.stream()
方法,而是流的终端操作(在本例中是
收集
)。所有管道都是惰性的,这意味着只有在需要时才调用中间操作的参数。从概念上讲,当
collect
触发管道的开始时,从源中提取元素,然后按顺序应用中间操作(当它对应时),最后应用终端操作。