Java8中的迭代返回列表中的最后一个值

Java8中的迭代返回列表中的最后一个值,java,list,lambda,java-8,java-stream,Java,List,Lambda,Java 8,Java Stream,很明显,我不擅长Java8。有人能告诉我为什么我的集合在迭代过程中没有保留所有的值吗?如果设置断点,代码将迭代,但只返回最后一个值 Set<Group> groups = new Hashset<>(); Group group = new Group(); List my = model.getValues(); list.stream().forEach(gr -> { group.setName(gr.getDescription()

很明显,我不擅长Java8。有人能告诉我为什么我的集合在迭代过程中没有保留所有的值吗?如果设置断点,代码将迭代,但只返回最后一个值

Set<Group> groups = new Hashset<>();
Group group = new Group();
List my = model.getValues();

list.stream().forEach(gr -> {
            group.setName(gr.getDescription());
            group.setDescription(gr.getDescription());

           groups.add(group); 
});

System.Out.Println(groups);
Set groups=newhashset();
组=新组();
列出my=model.getValues();
list.stream().forEach(gr->{
setName(gr.getDescription());
group.setDescription(gr.getDescription());
组。添加(组);
});
系统输出打印项次(组);

因为您在lambda表达式之外创建它。您需要在每次迭代中创建一个新实例,这应该可以:

Set<Group> groups = new Hashset<>();
List my = model.getValues();

list.stream().forEach(gr -> {
           Group group = new Group();
           group.setName(gr.getDescription());
           group.setDescription(gr.getDescription());

           groups.add(group); 
});

提供了一个正确的双参数构造函数。

list.stream().map(gr->{Group Group=new Group();Group.setName(gr.getDescription());Group.setDescription(gr.getDescription());return Group;}).collect(toSet())此代码中的问题太多,甚至无法编译。如果您在代码方面有一些具体的问题(即使您不想这样),那么请在您的问题中只包含一些代码,这些代码实际上可以让我们重现该问题,不要添加与您想问的问题无关的问题(如果我们专注于与实际问题无关的问题,这将浪费您的时间和精力)。您的第一个解决方案不适用于集合。您将只获得第一个值。我不得不把它改成列表,然后它就工作了。Thanks@Etch如果第一个解决方案不起作用,那么发布在这里的第二个解决方案也不起作用。它们都打算用不同的语法执行类似的操作。除此之外,应避免使用原始类型
列表
,为
名称
描述
属性设置相同的值似乎是代码的另一个问题,而
等于
实现在问题中是抽象的。
Set<Group> groups = list.stream()
    .map(gr -> new Group(gr.getDescription(), gr.getDescription())))
    .collect(Collectors.toSet());