如何使用java流将Set<A>转换为List<A1>?

问题描述 投票:0回答:6

我在客户端中有一个

class A
,并且在我的项目域中有一个相同的
class A1
。我有一个接收
Set<A>
的函数,我想将其转换为
List<A1>
并返回。我可以用传统的
foreach
循环来做到这一点。

但是这如何通过

streams
来完成呢?


private List<A1> myDataRep(final Set<A> myData) {
   //Convert and return List.
}

java list java-8 java-stream
6个回答
3
投票
return myData.stream()
   .map(a -> new A1(a)) // or however you convert a single A into an A1
   .collect(Collectors.toList());

1
投票

有多种方式:

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

1
投票

我有一个位于客户端的 A 类,并且我有一个相同的 A1 类

我猜说“相同”是指此类共享一些属性,因此

A
实例中包含的信息足以创建
A1
的新实例。

如果是这种情况,您可以在

A1
类中定义一个构造函数,该构造函数需要
A
的实例作为参数。

这样你的方法体可能看起来像这样:

return myData.stream().map(A1::new).toList();

注意,操作

toList()
可通过Java 16访问,对于早期版本,您应该使用
collect(Collectors.toList())
代替。


1
投票

您需要更改地图上的方法。

Set<Integer> integerSet = Set.of(1,2,3);  
List<String> stringList = integerSet.stream().map(String::valueOf).collect(Collectors.toList());


1
投票

我会定义一个 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());
  • Stream
    listA
    进行转换。
List<A1> listA1 = listA.stream().map(mapAtoA1).toList();
System.out.println(listA1);

打印

[1Alpha, 2Beta]

1
投票

您可以使用自定义映射方法将输入

Set
流式传输,然后将每个
© www.soinside.com 2019 - 2024. All rights reserved.