我在客户端中有一个
class A
,并且在我的项目域中有一个相同的 class A1
。我有一个接收 Set<A>
的函数,我想将其转换为 List<A1>
并返回。我可以用传统的foreach
循环来做到这一点。
但是这如何通过
streams
来完成呢?
private List<A1> myDataRep(final Set<A> myData) {
//Convert and return List.
}
return myData.stream()
.map(a -> new A1(a)) // or however you convert a single A into an A1
.collect(Collectors.toList());
有多种方式:
class Mapper<T> {
List<T> toList(Set<T> s) {
return s.stream().toList();
}
}
final Set<String> s = Sets.set("one", "two", "three");
// explicit creating a list
assertThat(Lists.newArrayList(s).size()).isEqualTo(3);
// using the stream API
assertThat(s.stream().toList().size()).isEqualTo(3);
// using a class decorating the conversion. it might
// add a bit of convenience, when state is required
// for mapping or filtering
assertThat(new Mapper<String>().toList(Sets.set("one", "two", "three")).size()).isEqualTo(3);
我有一个位于客户端的 A 类,并且我有一个相同的 A1 类
我猜说“相同”是指此类共享一些属性,因此
A
实例中包含的信息足以创建 A1
的新实例。
如果是这种情况,您可以在
A1
类中定义一个构造函数,该构造函数需要 A
的实例作为参数。
这样你的方法体可能看起来像这样:
return myData.stream().map(A1::new).toList();
注意,操作
toList()
可通过Java 16访问,对于早期版本,您应该使用collect(Collectors.toList())
代替。
您需要更改地图上的方法。
Set<Integer> integerSet = Set.of(1,2,3);
List<String> stringList = integerSet.stream().map(String::valueOf).collect(Collectors.toList());
我会定义一个 lambda 将
A
映射到 A1
record A(int getVal, String getStr) {}
record A1(String getStr){
@Override
public String toString() {
return getStr();
}
}
A's
列表。List<A> listA = List.of(new A(1, "Alpha"), new A(2, "Beta"));
Function<A, A1> mapAtoA1 = a-> new A1(a.getVal() + a.getStr());
listA
进行转换。List<A1> listA1 = listA.stream().map(mapAtoA1).toList();
System.out.println(listA1);
打印
[1Alpha, 2Beta]
您可以使用自定义映射方法将输入
Set
流式传输,然后将每个