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());