Java 8 在Java8GroupingBy中迭代收集的列表

Java 8 在Java8GroupingBy中迭代收集的列表,java-8,Java 8,我有一个对象列表,比如我使用类型(使用groupingBy)分组的列表 现在,我想将Map>转换为具有该组的列表和Id的Type2 class Type1{ int id; int type; String name; } class Type2{ int type; List<Type1> type1List; } 这很好用。但我正在努力使代码更干净。有没有一种方法可以避免再次流式处理这件事,并使用某种平面图来实现这一点。您可以将一个finisher函数传递给集合,然后在初始映

我有一个对象列表,比如我使用
类型
(使用groupingBy)分组的
列表
现在,我想将Map>转换为具有该组的列表和Id的Type2

class Type1{
int id;
int type;
String name;
}

class Type2{
int type;
List<Type1> type1List;
}

这很好用。但我正在努力使代码更干净。有没有一种方法可以避免再次流式处理这件事,并使用某种平面图来实现这一点。

您可以将一个finisher函数传递给
集合,然后在初始
映射形成后完成工作

List<Type2> result = myCustomList.stream()
    .collect(Collectors.collectingAndThen(Collectors.groupingBy(Type1::getType),
        m -> m.entrySet().stream()
            .map(e -> new Type2(e.getKey(), e.getValue()))
            .collect(Collectors.toList())));
List result=myCustomList.stream()
.collect(收集器.collectingAndThen(收集器.groupingBy(Type1::getType)),
m->m.entrySet().stream()
.map(e->new Type2(e.getKey(),e.getValue())
.collect(Collectors.toList());

您应该给
Type2
一个表单的构造函数

Type2(int type, List<Type1> type1List) {
    this.type = type;
    this.type1List = type1List;
}
另见
简而言之,这会造成内存泄漏,因为它会创建
Type2
的子类,该子类捕获
type1Item
的整个生命周期

但您可以作为
groupingBy
的下游收集器的一部分执行转换。这意味着您必须将
toList
显式化,以便通过
collecting将其与后续映射结合起来:

Collection<Type2> collect = myCustomList
    .stream()
    .collect(groupingBy(Type1::getType,
        collectingAndThen(toList(), l -> new Type2(l.get(0).getType(), l))))
    .values();

您可以执行以下操作:

type1.map( type1Item -> new Type2(
     type1Item.getKey(), type1Item
)).collect(Collectors.toList());

如果您想让代码更干净,请停止创建
Type2
的子类(也称为双花括号反模式)。给
Type2
一个接受类型和type1列表的构造函数。然后,您可以简单地使用
.map(t1->newtype2(t1.getKey(),t1.getValue())
。正如@Holger所评论的,我认为您不需要
Type2
类,您可以实现如此简单的目标<代码>映射结果=type1List.stream().collect(收集器.groupingBy(Type1::getType))
@HadiJ我的评论更多的是关于双花括号初始化模式,它创建了
Type2
的子类。但是是的,如果
Type2
仅与这两个属性相关,那么
Map
可能已经足够用于大多数目的了。
Collection<Type2> collect = myCustomList
    .stream()
    .collect(groupingBy(Type1::getType,
        collectingAndThen(toList(), l -> new Type2(l.get(0).getType(), l))))
    .values();
List<Type2> collect = myCustomList
    .stream()
    .collect(collectingAndThen(groupingBy(Type1::getType,
            collectingAndThen(toList(), l -> new Type2(l.get(0).getType(), l))),
        m -> new ArrayList<>(m.values())));
type1.map( type1Item -> new Type2(
     type1Item.getKey(), type1Item
)).collect(Collectors.toList());