gpt4 book ai didi

java - 流可以创建新对象吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:30:20 24 4
gpt4 key购买 nike

我会尽量简化我面临的情况。有 2 个实体:

class Foo {
String fooProperty;

@OneToOne
Bar bar;
}

class Bar {
String barProperty;
}

还有一个 DTO 类,具有 Foo 和 Bar 的属性:

class FooDto {
String fooProperty;
String barProperty;

public static FooDto from(Foo foo) {
return new FooDto(foo.fooProperty, foo.bar.barProperty);
}
}

FooDto 用于传送大量数据,并且可以使用流轻松完成转换:

fooList.stream().map(FooDto::from).(...)

现在,需求发生了变化,一个 Foo 可以有多个 Bars:

@OneToMany
List<Bar> bar;

还要求为每个包含的Bar生成一个FooDto,像这样:

Foo(fooProperty="foo1", bar=[Bar(barProperty="bar1"), Bar(barProperty="bar2")])

将转换为:

[FooDto(fooProperty="foo1", barProperty="bar1"), FooDto(fooProperty="foo1", barProperty="bar2")]

我设法使用中间列表解决了它,但我仍然不确定它是否是最佳解决方案。

我想知道是否可以使用纯流来做类似的事情。我可以使用 map 和过滤器并生成大小等于/小于原始输入,但我不知道如何生成包含更多元素的结果。

最佳答案

您要查找的操作称为 flatMap

它对 Foo 对象流进行操作,将一个函数作为参数,该函数将 Foo 对象转换为 FooDto 对象流,并且返回 FooDto 对象的流组合流:

class FooDto {
String fooProperty;
String barProperty;

public FooDto(String fooProperty, String barProperty) {
this.fooProperty = fooProperty;
this.barProperty = barProperty;
}

public static Stream<FooDto> from(Foo foo) {
return foo.bars.stream().map(bar -> new FooDto(foo.fooProperty, bar.barProperty));
}
}

然后:

List<FooDto> result = fooList.stream().flatMap(FooDto::from).(Collectors.toList());

关于java - 流可以创建新对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58017679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com